{
  "components": {
    "schemas": {
      "AbandonPersonPetInput": {
        "description": "Retire one person-owned Pet adoption into the Abandoned list at an exact revision.",
        "properties": {
          "expectedRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "expectedRevision"
        ],
        "type": "object"
      },
      "AccessGrantCause": {
        "description": "Why a grant in providers.access.grants exists (EDR-0095).",
        "enum": [
          "direct",
          "owner",
          "inherited",
          "audience"
        ],
        "type": "string"
      },
      "AccessLevel": {
        "description": "The common level of a grant in providers.access.grants (EDR-0095), from\nthe most access to the least. x-accessLevel maps each source role to a\nlevel. A source role that x-accessLevel maps to `none` grants nothing, and\nthe access job writes no grant row for it.",
        "enum": [
          "owner",
          "write",
          "comment",
          "read"
        ],
        "type": "string"
      },
      "AcknowledgeReportRunOutputsDeletedInput": {
        "description": "query-runner's acknowledgement that it deleted the output tables of some\nPlot results of one Report run (PARABLE-4452). Each result must be one\nweb-admin-api listed as deletable: an output of an expired run, or of a\ncomplete Plot inside a failed or cancelled run.",
        "properties": {
          "plotResultIds": {
            "description": "ParableReportPlotResult ids whose output tables are gone. A result\nalready acknowledged is accepted again and keeps its first time.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 1000,
            "type": "array"
          },
          "reportRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "reportRunId",
          "plotResultIds"
        ],
        "type": "object"
      },
      "AcknowledgeReportRunOutputsDeletedResult": {
        "properties": {
          "outputsDeletedAt": {
            "description": "Set once every output of an expired run is acknowledged. Null for a run\nthat still has an output, and always null for a failed or cancelled\nrun, whose late Plots can still record one.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "ActivateArtifactPublicationInput": {
        "additionalProperties": false,
        "properties": {
          "expectedActiveRevisionId": {
            "description": "The namespace's current active revision. Required to switch back to a READY\nrevision; without it, activating a READY revision only returns its receipt.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "namespaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "namespaceId",
          "revisionId"
        ],
        "type": "object"
      },
      "AddConnectorToTenantInput": {
        "properties": {
          "authenticationConfig": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "authenticationStrategyId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "connectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "groupingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "nullable": true,
            "type": "string"
          },
          "ingestionConfig": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "connectorId",
          "groupingId",
          "authenticationStrategyId",
          "authenticationConfig",
          "ingestionConfig"
        ],
        "type": "object"
      },
      "AddConnectorToTenantPayload": {
        "description": "Payload returned when adding a connector to a tenant",
        "properties": {
          "authenticationConfig": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "authenticationStrategy": {
            "$ref": "#/components/schemas/ConnectorAuthStrategy"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "credentialMetadataId": {
            "description": "the result of setting the connector config",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "The id of the newly created tenant connector instance",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ingestionConfig": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "message": {
            "description": "a message related to setting the connector config",
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "success": {
            "description": "was setting the connector config successful",
            "type": "boolean"
          },
          "tenant": {
            "$ref": "#/components/schemas/Tenant"
          }
        },
        "required": [
          "id",
          "tenant",
          "authenticationStrategy",
          "authenticationConfig",
          "ingestionConfig",
          "createdAt",
          "success",
          "credentialMetadataId",
          "message"
        ],
        "type": "object"
      },
      "AddressingConfig": {
        "description": "API addressing configuration for a connector or auth strategy.\nDefines the URL template and how each template variable is resolved at runtime.",
        "properties": {
          "basePath": {
            "description": "Base path appended to host (e.g. /ex/jira/{cloudId}). Must start with /.",
            "nullable": true,
            "type": "string"
          },
          "host": {
            "description": "API hostname. May contain {var} placeholders resolved from typed variables.",
            "nullable": true,
            "type": "string"
          },
          "scheme": {
            "description": "URL scheme. Defaults to https when omitted by runtime consumers.",
            "nullable": true,
            "type": "string"
          },
          "variables": {
            "description": "Typed declarations for {var} placeholders in host and basePath.",
            "items": {
              "$ref": "#/components/schemas/AddressingVariable"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "type": "object"
      },
      "AddressingVariable": {
        "description": "A single template variable in an AddressingConfig.",
        "properties": {
          "name": {
            "description": "Name of the {var} placeholder in host or basePath.",
            "type": "string"
          },
          "oauthResponsePath": {
            "description": "Dot-separated path into the OAuth token response body.\nRequired when source = oauth_response.",
            "nullable": true,
            "type": "string"
          },
          "required": {
            "description": "Whether a missing value for this variable should halt the sync.",
            "nullable": true,
            "type": "boolean"
          },
          "source": {
            "description": "Resolution source: user_input, oauth_response, or static.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "source"
        ],
        "type": "object"
      },
      "AdoptPetInput": {
        "properties": {
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "petId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "petStyleVariantId": {
            "description": "Required when more than one active style is available; the sole style is selected otherwise.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "petId",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "AdoptPetResult": {
        "properties": {
          "message": {
            "description": "Ready-to-display confirmation such as \"You've adopted Patrice the Parable Pickle!\".",
            "type": "string"
          },
          "pet": {
            "$ref": "#/components/schemas/PersonPet"
          }
        },
        "required": [
          "pet",
          "message"
        ],
        "type": "object"
      },
      "AgentSkill": {
        "description": "Mutable Workspace catalog entry used by the API and authoring UI.",
        "properties": {
          "content": {
            "description": "Markdown text",
            "maxLength": 65536,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "contentDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "description": {
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "displayTitle": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "files": {
            "items": {
              "$ref": "#/components/schemas/AgentSkillFile"
            },
            "maxItems": 400,
            "minItems": 0,
            "type": "array"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "Portable Agent Skills directory and frontmatter name",
            "maxLength": 64,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "displayTitle",
          "name",
          "icon",
          "description",
          "id",
          "revision",
          "contentDigest",
          "createdAt",
          "updatedAt",
          "content",
          "files"
        ],
        "type": "object"
      },
      "AgentSkillCatalogView": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/AgentSkillSummary"
            },
            "maxItems": 1000,
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "AgentSkillFile": {
        "description": "One reference file bundled with a skill (AI SDK Harness `files`). `path` is a\nskill-relative POSIX path such as `references/checklist.md`; `content` is text.\nThe instruction body discloses paths, and a runtime reads or searches the\ncontent only on demand.",
        "properties": {
          "content": {
            "maxLength": 262144,
            "minLength": 0,
            "type": "string"
          },
          "path": {
            "maxLength": 512,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "path",
          "content"
        ],
        "type": "object"
      },
      "AgentSkillSnapshot": {
        "description": "Immutable instruction snapshot accepted with a Ponder Run.",
        "properties": {
          "content": {
            "description": "Markdown text",
            "maxLength": 65536,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "contentDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "description": {
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "displayTitle": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "files": {
            "items": {
              "$ref": "#/components/schemas/AgentSkillFile"
            },
            "maxItems": 400,
            "minItems": 0,
            "type": "array"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "Portable Agent Skills directory and frontmatter name",
            "maxLength": 64,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "displayTitle",
          "name",
          "icon",
          "description",
          "content",
          "files",
          "id",
          "revision",
          "contentDigest"
        ],
        "type": "object"
      },
      "AgentSkillSummary": {
        "description": "Progressive-disclosure catalog entry; the instruction body is loaded separately.",
        "properties": {
          "contentDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "description": {
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "displayTitle": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "Portable Agent Skills directory and frontmatter name",
            "maxLength": 64,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "displayTitle",
          "name",
          "icon",
          "description",
          "id",
          "revision",
          "contentDigest",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "AnswerParableProblemPingInput": {
        "description": "Answers given inside the Problem that asked. Unlike the inbox route this one\ndoes not require an existing inbox item: a person who holds Pinging\nparticipation joins a question by answering it.",
        "properties": {
          "answers": {
            "items": {
              "$ref": "#/components/schemas/ParablePingAnswerInput"
            },
            "maxItems": 200,
            "minItems": 0,
            "type": "array"
          },
          "body": {
            "description": "Markdown text",
            "maxLength": 65536,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "expectedPingRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedPingRevision",
          "answers",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ApiKeyAuthConfig": {
        "description": "Configuration for API key authentication.",
        "properties": {
          "credentialHeaders": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "More headers sent with the API key on every request, for API_KEY_HEADER.\nMaps header name to the credential field whose value it carries, e.g.\n{'DD-APPLICATION-KEY': 'applicationKey'} beside headerName 'DD-API-KEY'.",
            "nullable": true,
            "type": "object"
          },
          "headerName": {
            "description": "Header name for API_KEY_HEADER (e.g., 'X-API-Key')",
            "nullable": true,
            "type": "string"
          },
          "queryParam": {
            "description": "Query parameter name for API_KEY_QUERY",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "ApiTokenAudienceEnum": {
        "description": "Where a personal access token (pat_) may be used (PARABLE-4943,\nPARABLE-5373).",
        "enum": [
          "all",
          "flight_sql",
          "mcp"
        ],
        "type": "string"
      },
      "ApiTypeEnum": {
        "description": "API transport protocol.\nDetermines how requests are constructed and executed.",
        "enum": [
          "rest",
          "graphql",
          "database",
          "file",
          "custom"
        ],
        "type": "string"
      },
      "AppendParableProblemMessageInput": {
        "properties": {
          "contextSelection": {
            "$ref": "#/components/schemas/ParableProblemContextSelectionInput"
          },
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "message": {
            "$ref": "#/components/schemas/NewParableProblemMessageInput"
          }
        },
        "required": [
          "expectedProblemRevision",
          "contextSelection",
          "message"
        ],
        "type": "object"
      },
      "AppendParableProblemMessageResult": {
        "properties": {
          "message": {
            "$ref": "#/components/schemas/ParableProblemMessage"
          },
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "message",
          "problemRevision"
        ],
        "type": "object"
      },
      "AppendParableProblemRunSessionEntriesInput": {
        "additionalProperties": false,
        "description": "ponder-api stores the pi journal entries one segment attempt appended since\nits last flush (EDR-0092 amendment A2). Only the live attempt of a started,\nunfinished step may write. An entry whose pi id is already stored is\nskipped; the first new entry must continue the stored tail (or be the\nsession header naming the Run when the journal is empty), so a stale\nattempt cannot fork the journal.",
        "properties": {
          "attempt": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "entries": {
            "description": "pi's entries in order, header first on a new journal.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "maxItems": 10000,
            "minItems": 1,
            "type": "array"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "stepIndex",
          "attempt",
          "entries"
        ],
        "type": "object"
      },
      "AppendParableProblemRunSessionEntriesResult": {
        "properties": {
          "accepted": {
            "description": "Entries this call stored; an entry id already stored is not counted.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "journalLength": {
            "description": "Entries the Run's journal holds after this call.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "accepted",
          "journalLength"
        ],
        "type": "object"
      },
      "AppendParableProblemRunStreamChunksInput": {
        "additionalProperties": false,
        "description": "ponder-api appends one batch of public stream parts to the Run's assistant\nMessage. Only the newest attempt of a started, unfinished step may append.\nIdempotent on (Run, stepIndex, seq): a seq already stored is skipped.",
        "properties": {
          "attempt": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "chunks": {
            "items": {
              "$ref": "#/components/schemas/PonderRunStreamChunk"
            },
            "maxItems": 512,
            "minItems": 1,
            "type": "array"
          },
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "messageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "messageId",
          "stepIndex",
          "attempt",
          "chunks"
        ],
        "type": "object"
      },
      "AppendParableProblemRunStreamChunksResult": {
        "properties": {
          "accepted": {
            "description": "Chunks this call stored; a seq already stored is not counted.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "messageChunkCount": {
            "description": "Chunks stored for the Message after this call; the batch's fact carries it as its revision less one.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "accepted",
          "messageChunkCount"
        ],
        "type": "object"
      },
      "ApplyLabPackageEditInput": {
        "description": "The edit that a plan answered, with the ref version and the plan digest\nthat the plan returned. Apply plans the edit again under the Parable lock.\nIt refuses a ref version or a digest that changed.",
        "properties": {
          "expectedVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "files": {
            "items": {
              "$ref": "#/components/schemas/LabPackageFileEditInput"
            },
            "minItems": 0,
            "type": "array"
          },
          "planDigest": {
            "type": "string"
          },
          "plots": {
            "items": {
              "$ref": "#/components/schemas/LabPlotDeclaration"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "files",
          "expectedVersion",
          "planDigest"
        ],
        "type": "object"
      },
      "ApplyPublishedPlotRunSummaryInput": {
        "description": "Terminal QueryRuns transition delivered by the durable execution shell.",
        "properties": {
          "errorCode": {
            "maxLength": 256,
            "nullable": true,
            "type": "string"
          },
          "errorMessage": {
            "description": "Safe diagnostic only. Do not send secrets or raw model payloads.",
            "maxLength": 2048,
            "nullable": true,
            "type": "string"
          },
          "lastSuccessAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "materializedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "plotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "queryRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scheduledFireAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "sealedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceUpdatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "spentCalls": {
            "format": "double",
            "type": "number"
          },
          "spentCost": {
            "format": "double",
            "type": "number"
          },
          "status": {
            "$ref": "#/components/schemas/QueryRunStatus"
          }
        },
        "required": [
          "plotId",
          "queryRunId",
          "status",
          "sourceUpdatedAt",
          "spentCost",
          "spentCalls"
        ],
        "type": "object"
      },
      "ApplyPublishedPlotRunSummaryResult": {
        "properties": {
          "errorCode": {
            "maxLength": 256,
            "nullable": true,
            "type": "string"
          },
          "errorMessage": {
            "maxLength": 2048,
            "nullable": true,
            "type": "string"
          },
          "lastSuccessAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "latestQueryRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "materializedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "plotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scheduledFireAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "sealedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceUpdatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "spentCalls": {
            "format": "double",
            "type": "number"
          },
          "spentCost": {
            "format": "double",
            "type": "number"
          },
          "status": {
            "$ref": "#/components/schemas/QueryRunStatus"
          },
          "updated": {
            "type": "boolean"
          }
        },
        "required": [
          "latestQueryRunId",
          "status",
          "sourceUpdatedAt",
          "spentCost",
          "spentCalls",
          "plotId",
          "updated"
        ],
        "type": "object"
      },
      "ApplyReportQueryRunTransitionInput": {
        "description": "One status change of the query run that executes one Plot of a Report run\n(PARABLE-4448). query-runner delivers every change of a Report-linked query\nrun from its outbox; a retried delivery can arrive after a newer one, so\nstatusSeq, not arrival order, decides which change is newest.\n\nThe query run's raw error text is not part of it: web-db stores a product\nmessage mapped from errorCode.",
        "properties": {
          "claimedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "completedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "errorCode": {
            "maxLength": 256,
            "nullable": true,
            "type": "string"
          },
          "failedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "materializedAt": {
            "description": "The input pin time of a successful output. PARABLE-4449 records it with\nthe run's output version; this operation only carries it.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "output": {
            "description": "The Plot's output table on SUCCEEDED; null on every other status.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ReportQueryRunOutput"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "outputRowCount": {
            "description": "Rows in the Plot's output on SUCCEEDED.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "plotId": {
            "description": "The Report Plot: ParablePlot.entityKey.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "queryRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sealedCommitId": {
            "description": "The sealed commit the query run executed. It must be the Report run's\npublished commit.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceUpdatedAt": {
            "description": "query.query_runs.updated_at at this change.",
            "format": "date-time",
            "type": "string"
          },
          "spentCalls": {
            "format": "double",
            "type": "number"
          },
          "spentCost": {
            "format": "double",
            "type": "number"
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/QueryRunStatus"
          },
          "statusSeq": {
            "description": "query.query_runs.status_seq after this change. It counts the query run's\nstatus changes.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "plotId",
          "queryRunId",
          "status",
          "statusSeq",
          "sourceUpdatedAt",
          "spentCost",
          "spentCalls"
        ],
        "type": "object"
      },
      "ApplyReportQueryRunTransitionResult": {
        "properties": {
          "applied": {
            "description": "False when the change was not newer than the one already applied, or the\nReport run is unknown. Either way the delivery is done.",
            "type": "boolean"
          },
          "plotResultStatus": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportPlotResultStatusEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "reportRunStatus": {
            "description": "The Report run and the Plot's result after the call. Null when the Report\nrun is unknown.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportRunStatus"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "required": [
          "applied"
        ],
        "type": "object"
      },
      "ApplyWorkspaceParableArchiveImportInput": {
        "properties": {
          "expectedVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "file": {
            "description": "Artifact file metadata with GCS storage path",
            "type": "object"
          },
          "planDigest": {
            "type": "string"
          }
        },
        "required": [
          "file",
          "expectedVersion",
          "planDigest"
        ],
        "type": "object"
      },
      "ApplyWorkspaceParableArchiveImportResult": {
        "properties": {
          "planDigest": {
            "type": "string"
          },
          "proposalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resultingVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "rootRefId",
          "resultingVersion",
          "planDigest"
        ],
        "type": "object"
      },
      "ApprovalMessageCausationRef": {
        "properties": {
          "approvalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ProblemMessageCausationKindEnum"
          }
        },
        "required": [
          "kind",
          "approvalId"
        ],
        "type": "object"
      },
      "ApproveTenantProviderPoolRebuildInput": {
        "description": "Approve one of this Workspace's Provider Pool rebuilds (PARABLE-5348).",
        "properties": {
          "classificationHash": {
            "description": "The item's classificationHash as the approver was shown it. A different\nhash is refused with the current one.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "notBefore": {
            "description": "The earliest time the rebuild may start; null starts it as soon as it can.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "classificationHash"
        ],
        "type": "object"
      },
      "ArtifactAnalysisResult": {
        "additionalProperties": false,
        "properties": {
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "nullable": true,
            "type": "object"
          },
          "rowCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "sampleRows": {
            "description": "At most 500 rows and a bounded total encoded size; empty for OPAQUE inputs.",
            "items": {
              "description": "A Parable Schema in JSON",
              "type": "object"
            },
            "type": "array"
          },
          "source": {
            "$ref": "#/components/schemas/ArtifactStagedObject",
            "description": "Verified immutable retained input, outside staging expiry."
          },
          "truncated": {
            "type": "boolean"
          }
        },
        "required": [
          "source",
          "sampleRows",
          "truncated"
        ],
        "type": "object"
      },
      "ArtifactDataPreview": {
        "description": "Server-side preview of the data backing an artifact, used by the schema\neditor. The schema describing the row shape is returned alongside the\ndata so consumers can render without a separate fetch.",
        "properties": {
          "inference": {
            "description": "Persisted inference results for the artifact, when available. The\nembedded `schema` is the same `Parable_Schema` returned at the top\nlevel (i.e. `inference.schema == schema` when both are present), so\nthe schema editor can be driven from a single shape. `model` is empty\nand the token counts are zero because those are inference-call-time\nsignals and are not persisted with the artifact. Null when the\nartifact has no persisted `dataSchema` or when no inference metadata\nwas captured (e.g. artifacts predating EDR-0021 Phase 1).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactInference"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "rows": {
            "description": "Preview rows, each conforming to `schema`. Capped server-side to 500\nrows.",
            "items": {
              "description": "A Parable Schema in JSON",
              "type": "object"
            },
            "type": "array"
          },
          "schema": {
            "description": "Schema describing each row (matches `TenantArtifact.dataSchema`).\nWhen the artifact has a persisted `dataSchema` this is that schema;\notherwise the server synthesizes an all-String fallback so the row\ntable is always renderable.",
            "type": "object"
          },
          "truncated": {
            "description": "True when the underlying artifact has more rows than were returned.",
            "type": "boolean"
          }
        },
        "required": [
          "schema",
          "rows",
          "truncated"
        ],
        "type": "object"
      },
      "ArtifactDeleteResult": {
        "additionalProperties": false,
        "properties": {
          "deletedObjects": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "deletedObjects"
        ],
        "type": "object"
      },
      "ArtifactInference": {
        "description": "Schema inference output for an uploaded artifact. The inferred schema is\nreturned as a first-class `Parable_Schema` (the same shape that lives on\nthe persisted `TenantArtifact.dataSchema`). Per-column inference signal\nthat does not belong inside the schema itself (confidence, demotion,\nsample failure stats) lives in `columnMetadata`, keyed by `fieldPath` to\nthe matching `FieldDef` in the schema.",
        "properties": {
          "columnMetadata": {
            "description": "Per-column inference signal. Each entry references a field in `schema`\nvia its `fieldPath` (e.g. \"Inferred.email\").",
            "items": {
              "$ref": "#/components/schemas/ArtifactInferenceColumnMetadata"
            },
            "type": "array"
          },
          "model": {
            "description": "Provider model identifier used for inference: the model the Workspace's\nmodel policy resolved for SCHEMA_INFERENCE.",
            "type": "string"
          },
          "processor": {
            "description": "The AI processor that ran the model. Set by `runArtifactSchemaInference`;\nnull where the call ran no inference, as in `artifactDataPreview`.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ModelProcessor"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "schema": {
            "description": "The inferred schema. Field rationale from the model is folded into\n`FieldDef.description` so the schema is self-documenting.",
            "type": "object"
          },
          "tokenInputCount": {
            "description": "Input tokens consumed by the inference call.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "tokenOutputCount": {
            "description": "Output tokens produced by the inference call.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "schema",
          "columnMetadata",
          "model",
          "tokenInputCount",
          "tokenOutputCount"
        ],
        "type": "object"
      },
      "ArtifactInferenceColumnMetadata": {
        "description": "Per-column inference signal that is not encoded in the `Parable_Schema`\nitself. Linked back to the schema via `fieldPath`.",
        "properties": {
          "confidence": {
            "$ref": "#/components/schemas/ArtifactInferenceConfidenceEnum",
            "description": "Inferer's reported confidence for this column."
          },
          "demoted": {
            "description": "True if the column was demoted by post-validation (model proposed a\nscalar that the sample data did not satisfy).",
            "type": "boolean"
          },
          "fieldPath": {
            "description": "Path to the matching `FieldDef` in the inferred schema, formatted as\n\"{typeName}.{fieldName}\" (e.g. \"Inferred.email\"). Stable identifier the\neditor uses to merge this metadata with the schema.",
            "type": "string"
          },
          "firstSampleError": {
            "description": "First sample-validation error message, when one occurred.",
            "nullable": true,
            "type": "string"
          },
          "sampleFailures": {
            "description": "Number of sample values that failed validation.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "sampleSeen": {
            "description": "Number of sample values evaluated against the chosen type.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "fieldPath",
          "confidence",
          "demoted",
          "sampleSeen",
          "sampleFailures"
        ],
        "type": "object"
      },
      "ArtifactInferenceConfidenceEnum": {
        "description": "Confidence level reported by schema inference for a single column.",
        "enum": [
          "low",
          "medium",
          "high"
        ],
        "type": "string"
      },
      "ArtifactInferenceError": {
        "description": "Structured error returned when schema inference fails.",
        "properties": {
          "code": {
            "$ref": "#/components/schemas/WebApiArtifactError",
            "description": "Typed error code from the web-api artifact error enum."
          },
          "message": {
            "description": "Human-readable error message.",
            "type": "string"
          }
        },
        "required": [
          "code",
          "message"
        ],
        "type": "object"
      },
      "ArtifactInfo": {
        "description": "Artifact metadata for customer display.",
        "properties": {
          "analysisWork": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactWorkStatus"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "attributedTapId": {
            "description": "ID of the TenantConnectorTap that was derived from this artifact, if any.\nPopulated by a query-time lookup from `tenant_connector_tap.artifact_id`\nrather than a stored column (the inverse FK is intentionally one-way; see\nEDR-0021 Phase 1 cycle-breaking decision). Null until the artifact has\nbeen processed and its derived tap has been created.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "dataSchema": {
            "description": "Current persisted schema. Null until a schema is generated or saved.",
            "nullable": true,
            "type": "object"
          },
          "fileName": {
            "type": "string"
          },
          "fileSize": {
            "description": "File size in bytes (non-negative, BIGINT-backed)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "fileType": {
            "$ref": "#/components/schemas/ArtifactTypeEnum"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "path": {
            "description": "Virtual-folder path for this artifact, dot-separated ltree. NULL means\nthe artifact lives at the tenant root.",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$",
            "type": "string"
          },
          "publishWork": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactWorkStatus"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "schemaInferenceStatus": {
            "$ref": "#/components/schemas/ArtifactSchemaInferenceStatusEnum"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "uploadStatus": {
            "$ref": "#/components/schemas/ArtifactUploadStatusEnum"
          },
          "uploadedBy": {
            "$ref": "#/components/schemas/UserInfo"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "fileName",
          "fileType",
          "fileSize",
          "uploadStatus",
          "schemaInferenceStatus",
          "uploadedBy"
        ],
        "type": "object"
      },
      "ArtifactIngestResult": {
        "additionalProperties": false,
        "properties": {
          "commitDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "deltaVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "storageUri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "verifiedInputSha256": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "verifiedRowCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "storageUri",
          "deltaVersion",
          "verifiedRowCount",
          "verifiedInputSha256",
          "commitDigest"
        ],
        "type": "object"
      },
      "ArtifactInputFormat": {
        "description": "The single transport-format contract shared by uploads and publication ingestion.",
        "enum": [
          "CSV",
          "ARROW_IPC_STREAM",
          "OPAQUE"
        ],
        "type": "string"
      },
      "ArtifactPublicationNamespaceInput": {
        "additionalProperties": false,
        "properties": {
          "namespaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "namespaceId"
        ],
        "type": "object"
      },
      "ArtifactPublicationNamespaceResult": {
        "properties": {
          "cleanupWork": {
            "description": "Durable cleanup of every stored input and table output in the namespace.",
            "items": {
              "$ref": "#/components/schemas/ArtifactWorkStatus"
            },
            "type": "array"
          },
          "namespaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "namespaceId",
          "cleanupWork"
        ],
        "type": "object"
      },
      "ArtifactPublicationReceipt": {
        "properties": {
          "activeRevisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedBaseRevisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "failureCode": {
            "nullable": true,
            "type": "string"
          },
          "namespaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "namespaceSlug": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "previousRevisionId": {
            "description": "The revision active before the current one; activation can switch back to it.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/ArtifactRevisionStateEnum"
          },
          "tables": {
            "items": {
              "$ref": "#/components/schemas/ArtifactPublicationTableReceipt"
            },
            "type": "array"
          }
        },
        "required": [
          "namespaceId",
          "namespaceSlug",
          "revisionId",
          "state",
          "tables"
        ],
        "type": "object"
      },
      "ArtifactPublicationRevisionResult": {
        "properties": {
          "cleanupWork": {
            "description": "Durable cleanup of the storage that no retained revision still uses.",
            "items": {
              "$ref": "#/components/schemas/ArtifactWorkStatus"
            },
            "type": "array"
          },
          "namespaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "namespaceId",
          "revisionId",
          "cleanupWork"
        ],
        "type": "object"
      },
      "ArtifactPublicationSelection": {
        "additionalProperties": false,
        "properties": {
          "namespaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "namespaceId",
          "revisionId"
        ],
        "type": "object"
      },
      "ArtifactPublicationTableInput": {
        "additionalProperties": false,
        "description": "Complete immutable input declaration. Storage locations are assigned by the service,\nand the worker derives the table's schema from the uploaded input.",
        "properties": {
          "inputFormat": {
            "$ref": "#/components/schemas/ArtifactInputFormat"
          },
          "inputSha256": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "name": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "rowCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "sizeBytes": {
            "description": "File size in bytes (non-negative, BIGINT-backed)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "name",
          "rowCount",
          "inputSha256",
          "sizeBytes",
          "inputFormat"
        ],
        "type": "object"
      },
      "ArtifactPublicationTableReceipt": {
        "properties": {
          "analysisWork": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactWorkStatus"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "declaration": {
            "$ref": "#/components/schemas/ArtifactPublicationTableInput"
          },
          "ingestWork": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactWorkStatus"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "outputSchema": {
            "description": "The schema the worker derived from the uploaded input. Null until analysis succeeds.",
            "nullable": true,
            "type": "object"
          },
          "reused": {
            "description": "True when the table was unchanged from the base revision and reuses its stored data.",
            "type": "boolean"
          },
          "storageVerified": {
            "type": "boolean"
          },
          "tableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tableId",
          "declaration",
          "storageVerified",
          "reused"
        ],
        "type": "object"
      },
      "ArtifactPublicationUpload": {
        "properties": {
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "name": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "requiredHeaders": {
            "items": {
              "$ref": "#/components/schemas/ArtifactUploadHeader"
            },
            "type": "array"
          },
          "tableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "uploadUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "required": [
          "tableId",
          "name",
          "uploadUrl",
          "requiredHeaders",
          "expiresAt"
        ],
        "type": "object"
      },
      "ArtifactRevisionStateEnum": {
        "description": "READY means activated successfully at least once; the namespace selects the current revision.",
        "enum": [
          "STAGING",
          "FAILED",
          "READY"
        ],
        "type": "string"
      },
      "ArtifactSchemaInferenceStatusEnum": {
        "description": "Status of optional schema inference for an artifact",
        "enum": [
          "not_requested",
          "processing",
          "succeeded",
          "failed",
          "skipped_by_policy"
        ],
        "type": "string"
      },
      "ArtifactStagedObject": {
        "additionalProperties": false,
        "properties": {
          "generation": {
            "description": "Null only for initial ANALYSE: the worker captures and pins the create-only object's generation.",
            "nullable": true,
            "type": "string"
          },
          "inputFormat": {
            "$ref": "#/components/schemas/ArtifactInputFormat"
          },
          "sha256": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "sizeBytes": {
            "description": "File size in bytes (non-negative, BIGINT-backed)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "uri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          }
        },
        "required": [
          "uri",
          "sizeBytes",
          "inputFormat"
        ],
        "type": "object"
      },
      "ArtifactStorageWorkResult": {
        "additionalProperties": false,
        "properties": {
          "analysis": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactAnalysisResult"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "artifactId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "deletion": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactDeleteResult"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "errorCode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactWorkErrorCode"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "errorMessage": {
            "nullable": true,
            "type": "string"
          },
          "ingestion": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactIngestResult"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "kind": {
            "$ref": "#/components/schemas/ArtifactWorkKind"
          },
          "payloadDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/ArtifactWorkState",
            "description": "Only terminal SUCCEEDED, FAILED or CANCELLED are accepted by completion."
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "workId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "workId",
          "tenantId",
          "artifactId",
          "payloadDigest",
          "kind",
          "state"
        ],
        "type": "object"
      },
      "ArtifactTypeEnum": {
        "description": "Type of uploaded artifact file",
        "enum": [
          "csv",
          "xlsx",
          "xls",
          "numbers",
          "ods",
          "zip"
        ],
        "type": "string"
      },
      "ArtifactUploadHeader": {
        "properties": {
          "name": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "value"
        ],
        "type": "object"
      },
      "ArtifactUploadResult": {
        "description": "Shared result shape for `uploadArtifact` and `runArtifactSchemaInference`.\nCarries the persisted artifact record alongside optional inference output\nand a small sample-row preview so the schema editor can render without an\nextra round trip.\nInference fields are populated only by `runArtifactSchemaInference`. In\n`uploadArtifact` responses, `inference`, `inferenceError` and\n`inferenceRefusal` are always null (upload never runs inference).",
        "properties": {
          "artifact": {
            "$ref": "#/components/schemas/ArtifactInfo",
            "description": "The persisted artifact record."
          },
          "inference": {
            "description": "Schema inference output. Always null in `uploadArtifact` responses\n(upload does not run inference). Populated by\n`runArtifactSchemaInference` on success; null on that call when\ninference failed -- in which case `inferenceError` is populated.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactInference"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "inferenceError": {
            "description": "Populated only by `runArtifactSchemaInference` when inference failed.\nThe artifact remains available with `uploadStatus = READY`,\n`schemaInferenceStatus = FAILED`, and its current `dataSchema`\nunchanged. Always null in `uploadArtifact` responses.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactInferenceError"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "inferenceRefusal": {
            "description": "Populated only by `runArtifactSchemaInference` when the Workspace's model\npolicy refused schema inference (PARABLE-4674): no processor received\nthe sample. The artifact remains available with `uploadStatus = READY`,\n`schemaInferenceStatus = SKIPPED_BY_POLICY`, and its current `dataSchema`\nunchanged; `inference` and `inferenceError` are null. Always null in\n`uploadArtifact` responses.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ModelPolicyRefusal"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "sampleRows": {
            "description": "Preview rows from the parsed sample, used to seed the schema editor.\nEach row is a `Parable_SchemaData` keyed by field name, conforming to\nthe artifact's current `dataSchema` (header-only all-`String` after\nCSV upload; the inferred schema after `runArtifactSchemaInference`).\nEmpty for non-CSV uploads, which are not parsed at upload time.",
            "items": {
              "description": "A Parable Schema in JSON",
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "artifact",
          "sampleRows"
        ],
        "type": "object"
      },
      "ArtifactUploadStatusEnum": {
        "description": "Availability status of an uploaded artifact file",
        "enum": [
          "pending",
          "processing",
          "ready",
          "failed"
        ],
        "type": "string"
      },
      "ArtifactWorkErrorCode": {
        "enum": [
          "INVALID_SOURCE",
          "INVALID_SCHEMA",
          "SIZE_MISMATCH",
          "CHECKSUM_MISMATCH",
          "ROW_COUNT_MISMATCH",
          "UNSUPPORTED_FORMAT",
          "STORAGE_ERROR",
          "CANCELLED",
          "INTERNAL_ERROR",
          "DISPATCH_REJECTED",
          "DISPATCH_EXHAUSTED"
        ],
        "type": "string"
      },
      "ArtifactWorkKind": {
        "enum": [
          "ANALYSE",
          "INGEST",
          "DELETE"
        ],
        "type": "string"
      },
      "ArtifactWorkState": {
        "enum": [
          "PENDING",
          "CLAIMED",
          "RUNNING",
          "SUCCEEDED",
          "FAILED",
          "CANCELLED"
        ],
        "type": "string"
      },
      "ArtifactWorkStatus": {
        "properties": {
          "artifactId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "errorCode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ArtifactWorkErrorCode"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "errorMessage": {
            "nullable": true,
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/ArtifactWorkState"
          },
          "tapId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "workId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "workId",
          "artifactId",
          "state"
        ],
        "type": "object"
      },
      "AskParableProblemMessagePingInput": {
        "additionalProperties": false,
        "properties": {
          "arguments": {
            "description": "A PonderPingQuestionRequest exactly as the model authored it; kept raw because the Ask approval digest covers it."
          },
          "scope": {
            "$ref": "#/components/schemas/ParableProblemMessageToolScope"
          },
          "toolCallId": {
            "maxLength": 512,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "scope",
          "toolCallId",
          "arguments"
        ],
        "type": "object"
      },
      "AskParableProblemMessagePingResult": {
        "description": "What the model and the public Message learn after asking: the Ping identity\nand the questions as recorded, not the whole Ping card.",
        "properties": {
          "pingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "questions": {
            "items": {
              "$ref": "#/components/schemas/PonderPingQuestionView"
            },
            "maxItems": 200,
            "minItems": 0,
            "type": "array"
          },
          "recovery": {
            "nullable": true,
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemMessagePingAskStatusEnum"
          },
          "summary": {
            "description": "Markdown text",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "status",
          "questions"
        ],
        "type": "object"
      },
      "AskParableProblemRunPingInput": {
        "additionalProperties": false,
        "description": "A model in a durable Run asking the people in its Problem something\n(EDR-0092 spec 2.3). The Run's sealed proof is the scope: no Message tool\nscope travels with the ask, because the Run row already holds the actor,\nthe model route, the context and the tool grant. web-api writes the Ping as the\nRun's initiator, attached to the Run's assistant Message, so its causation\nis the Run. The answer is AskParableProblemMessagePingResult, the same shape\na Message-scoped ask answers with.",
        "properties": {
          "arguments": {
            "description": "A PonderPingQuestionRequest exactly as the model authored it; kept raw\nbecause an approval digest may cover it. web-api derives the Ping's\nreplay identity from the Run's assistant Message and these questions, as\nthe Message-scoped ask does, so asking the same question again returns\nthe Ping already asked."
          },
          "dispatchSnapshotDigest": {
            "description": "The sealed digest the step holds; refused when it is not the Run's.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "messageId": {
            "description": "The Run's assistant Message; claimed here when no chunk batch has claimed it yet.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "toolCallId": {
            "maxLength": 512,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "stepIndex",
          "messageId",
          "toolCallId",
          "arguments"
        ],
        "type": "object"
      },
      "AsyncQueryConfig": {
        "description": "Configuration for asynchronous create-poll-fetch query execution.\nUsed by APIs that require submitting a query, polling for completion,\nand then fetching results from a separate endpoint.",
        "properties": {
          "columnNamesPath": {
            "description": "JMESPath to the column-name array on the status or result response. Falls\nback to the default manifest paths when unset.",
            "nullable": true,
            "type": "string"
          },
          "completionStatusCode": {
            "description": "HTTP status code that signals completion while polling. When set, completion\nis decided by the HTTP status instead of statusPath/successValue.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "externalLinksPath": {
            "description": "JMESPath to an array of presigned result links on a chunk payload\n(Databricks EXTERNAL_LINKS disposition). When set, chunk fetch downloads\nresult bytes from those URLs instead of reading rows out of the chunk\nresponse. Presigned URLs carry their own credentials, so the download is\nissued without the connector's Authorization header.",
            "nullable": true,
            "type": "string"
          },
          "failureValue": {
            "description": "Status value indicating the query failed (optional)",
            "nullable": true,
            "type": "string"
          },
          "failureValues": {
            "description": "Additional terminal failure status values (optional). Merged with\nfailureValue when present so vendors with several terminal failure\nstates (e.g. Databricks FAILED/CANCELED/CLOSED) do not stall until\nmaxPollSeconds.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "maxPollSeconds": {
            "description": "Maximum seconds to poll before treating as a timeout (default: 3600)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "partitionCountPath": {
            "description": "JMESPath to the partition array on the status response whose length is the\npartition count.",
            "nullable": true,
            "type": "string"
          },
          "partitionParam": {
            "description": "Query-parameter name carrying the partition index. Selects the\npartition-index fetch model instead of the chunk-index model.",
            "nullable": true,
            "type": "string"
          },
          "pollIntervalSeconds": {
            "description": "Seconds between status poll requests (default: 30)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "queryIdPath": {
            "description": "JMESPath to extract the query ID from the create-query response",
            "type": "string"
          },
          "recordsEndpoint": {
            "description": "Endpoint template for fetching results (use {queryId} placeholder)",
            "type": "string"
          },
          "recordsPagination": {
            "description": "Pagination config for the results endpoint",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PaginationConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "recordsQueryParams": {
            "description": "Query parameters for the results endpoint",
            "nullable": true
          },
          "recordsResponsePath": {
            "description": "JMESPath to extract records from the results response",
            "type": "string"
          },
          "statusEndpoint": {
            "description": "Endpoint template for polling status (use {queryId} placeholder)",
            "type": "string"
          },
          "statusPath": {
            "description": "JMESPath to extract status string from the poll response",
            "type": "string"
          },
          "successValue": {
            "description": "Status value indicating the query completed successfully",
            "type": "string"
          }
        },
        "required": [
          "queryIdPath",
          "statusEndpoint",
          "statusPath",
          "successValue",
          "recordsEndpoint",
          "recordsResponsePath"
        ],
        "type": "object"
      },
      "AttachParableProblemContextInput": {
        "properties": {
          "context": {
            "$ref": "#/components/schemas/NewParableProblemContextInput"
          },
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedProblemRevision",
          "context",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "AuthMethodEnum": {
        "description": "Authentication method for API calls.",
        "enum": [
          "bearer",
          "basic",
          "api_key_header",
          "api_key_query",
          "oauth2_client_credentials",
          "oauth2_refresh",
          "google_domain_wide_delegation",
          "oauth2_jwt_bearer",
          "oauth2_auth_code_pkce",
          "session_exchange",
          "session_exchange_jwt",
          "session_exchange_password",
          "custom",
          "saml",
          "mtls",
          "ssh_key",
          "kerberos",
          "aws_sig_v4",
          "gcp_service_account",
          "hmac",
          "digest",
          "ntlm",
          "azure_ad",
          "oauth2_device_code"
        ],
        "type": "string"
      },
      "AuthPayload": {
        "description": "Authentication Response Types",
        "properties": {
          "desktopConnect": {
            "description": "Device connect bundle for the Pulse desktop agent. Only set by\nconsumeDesktopAuthTokenForClient for a Pulse code, and only when the\nperson who minted it was an active member of a Workspace that has one\nPulse connector with its activity stream on (PARABLE-7159). Null\neverywhere else, Ponder included.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/DesktopConnectBundle"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "redirectTo": {
            "description": "Absolute URL the client should redirect to after the cookie is set. The\nserver picks this based on the flow: new tenant subdomain on signup,\ninvited tenant on invite, first-tenant-or-picker on login. Clients should\ntreat this as opaque and not parse it.",
            "type": "string"
          },
          "refreshToken": {
            "description": "JSON Web Token string",
            "pattern": "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+$",
            "type": "string"
          },
          "token": {
            "description": "JSON Web Token string",
            "pattern": "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+$",
            "type": "string"
          },
          "user": {
            "$ref": "#/components/schemas/UserWithPermissions"
          }
        },
        "required": [
          "user",
          "token",
          "refreshToken",
          "expiresAt",
          "redirectTo"
        ],
        "type": "object"
      },
      "AuthStrategySupportEnum": {
        "description": "Whether customers may use an auth strategy (PARABLE-4173). A strategy is\nusable only when every backend runs its type end to end: credential\nvalidation in web-api and the ingestion transport. Research may record a\nstrategy Parable cannot run yet, so the catalog keeps what the vendor\noffers without exposing it.",
        "enum": [
          "supported",
          "unsupported"
        ],
        "type": "string"
      },
      "AuthSuccess": {
        "properties": {
          "message": {
            "type": "string"
          },
          "success": {
            "type": "boolean"
          }
        },
        "required": [
          "success",
          "message"
        ],
        "type": "object"
      },
      "AvailableDataKindEnum": {
        "enum": [
          "table",
          "column"
        ],
        "type": "string"
      },
      "AvailableDataMatch": {
        "description": "One table, column, or field inside a struct column that matched a search,\nor one table of a listing.",
        "properties": {
          "columnName": {
            "description": "The column to select, quoted where SQL needs it, such as `priority` or\n`fields.assignee.\"displayName\"`. Null for a table.",
            "nullable": true,
            "type": "string"
          },
          "dataType": {
            "description": "The Arrow type, with its Parable scalar when it has one.",
            "nullable": true,
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AvailableDataKindEnum"
          },
          "matchedBy": {
            "description": "`keyword`, `semantic` or `both`; `listed` in a listing.",
            "type": "string"
          },
          "pool": {
            "description": "The Pool the match is in, such as `providers`.",
            "type": "string"
          },
          "provider": {
            "description": "The Provider the data comes from. Null for a table that belongs to none,\nand in a listing, where tableRef names the Provider.",
            "nullable": true,
            "type": "string"
          },
          "qualifiedName": {
            "type": "string"
          },
          "rowCount": {
            "description": "Rows in the table when maintenance last counted them, in a listing only.\nNull when the count is unknown, zero, or withheld by a Provider Policy.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "score": {
            "description": "Relevance; higher is better, comparable within one search only. 0 in a\nlisting.",
            "format": "double",
            "type": "number"
          },
          "tableRef": {
            "description": "The name to put in FROM, such as `providers.jiracloud.issues`.",
            "type": "string"
          }
        },
        "required": [
          "pool",
          "kind",
          "tableRef",
          "qualifiedName",
          "score",
          "matchedBy"
        ],
        "type": "object"
      },
      "AvailableDataProvider": {
        "description": "One Provider of a listing.",
        "properties": {
          "scope": {
            "description": "The scope that lists this Provider's tables, such as `providers.jiracloud`.",
            "type": "string"
          },
          "tableCount": {
            "description": "How many tables the Provider has in the providers Pool.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "scope",
          "tableCount"
        ],
        "type": "object"
      },
      "BasicAuthConfig": {
        "description": "Configuration for HTTP basic authentication.",
        "properties": {
          "passwordField": {
            "description": "Config field path for password (e.g., 'auth.apiToken')",
            "type": "string"
          },
          "passwordValue": {
            "description": "Static password when the API expects a fixed value (e.g. BambooHR HTTP Basic uses x).\nApplied when decrypted credentials omit the password field.",
            "nullable": true,
            "type": "string"
          },
          "usernameField": {
            "description": "Config field path for username (e.g., 'auth.email')",
            "type": "string"
          }
        },
        "required": [
          "usernameField",
          "passwordField"
        ],
        "type": "object"
      },
      "BearerAuthConfig": {
        "description": "Configuration for bearer token authentication.",
        "properties": {
          "headerName": {
            "description": "Header name (default: 'Authorization')",
            "nullable": true,
            "type": "string"
          },
          "tokenField": {
            "description": "Token Field (defaults to: 'token')",
            "nullable": true,
            "type": "string"
          },
          "tokenPrefix": {
            "description": "Token prefix (default: 'Bearer'); an empty prefix sends the bare token",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "BindPonderRunInput": {
        "additionalProperties": false,
        "description": "ponder-runner binds its admission unit and orchestration instance to a\npending Run (`bindPonderRun`, EDR-0092 D6). The dispatch digest proves the\nrunner was started for the Run's sealed dispatch.",
        "properties": {
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "dispatchSnapshotDigestVersion": {
            "$ref": "#/components/schemas/ParableProblemDispatchSnapshotDigestVersionEnum"
          },
          "orchestrationInstanceId": {
            "description": "ponder::{tenant}::{unit}, the orchestration instance that drives the Run.",
            "maxLength": 256,
            "minLength": 1,
            "type": "string"
          },
          "unitId": {
            "description": "ponder.ponder_runs.id; web-api records it as the Run's workflowRunId.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "unitId",
          "orchestrationInstanceId",
          "dispatchSnapshotDigestVersion",
          "dispatchSnapshotDigest"
        ],
        "type": "object"
      },
      "BodyEncodingEnum": {
        "description": "Serialization of a POST/PUT/PATCH request body for a REST endpoint.",
        "enum": [
          "json",
          "form"
        ],
        "type": "string"
      },
      "BreakglassSendInput": {
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "BrowseArtifactsResult": {
        "description": "Listing of artifacts and immediate child folders at a given path for the\ncurrent tenant. Folders are virtual: each entry in `folders` is the next\nlabel below `path` for which at least one non-deleted artifact exists.",
        "properties": {
          "artifacts": {
            "description": "Artifacts whose `path` equals `path` (or whose `path` is NULL when\nlisting the root). Sorted by createdAt descending.",
            "items": {
              "$ref": "#/components/schemas/ArtifactInfo"
            },
            "type": "array"
          },
          "folders": {
            "description": "Immediate child folder names (single label, not full path). Sorted\nalphabetically.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "path": {
            "description": "The path that was browsed; NULL when listing the tenant root.",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$",
            "type": "string"
          }
        },
        "required": [
          "folders",
          "artifacts"
        ],
        "type": "object"
      },
      "CancelParableProblemRunInput": {
        "properties": {
          "expectedRunRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reason": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "expectedRunRevision",
          "idempotencyKey",
          "reason"
        ],
        "type": "object"
      },
      "CaptureScheduledReportRunInput": {
        "description": "One occurrence of a Report plan that query-runner's Report plan sweep found\ndue (PARABLE-4447).",
        "properties": {
          "expectedRevision": {
            "description": "The Preference revision the fire was computed from. A plan saved since then\nanswers STALE.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "fireAt": {
            "description": "The occurrence. The Report run's id derives from the Workspace's line, the\nplan and this instant, so one fire captures at most one run.",
            "format": "date-time",
            "type": "string"
          },
          "fireId": {
            "description": "query-runner's fire ledger id. Logged with the run so the two services'\nrecords of one fire can be joined.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "planKey": {
            "description": "The reportPlan Preference id, equal to ParableReportPlanState.planKey.\nThe tenant header names the Workspace, and the capture runs the plan on\nthat Workspace's line, with that line's state (PARABLE-6286).",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "trigger": {
            "description": "Why the plan fired (PARABLE-5748). Null or SCHEDULED is an occurrence of\nthe plan's recurrence; SOURCES is a change of its sources, and needs the\nplan's afterSources on. MANUAL is refused. The Report run records it.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportRunTrigger"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "triggerSources": {
            "description": "For a SOURCES fire, the source changes the fire recorded. The Report run\nkeeps them. Ignored for any other trigger.",
            "items": {
              "$ref": "#/components/schemas/ParableReportTriggerSource"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "fireId",
          "planKey",
          "fireAt",
          "expectedRevision"
        ],
        "type": "object"
      },
      "CaptureScheduledReportRunResult": {
        "properties": {
          "enqueue": {
            "description": "query-runner's enqueue payload for a run whose query runs are not\nenqueued yet. Null once they are, and for every other outcome.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportRunEnqueue"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "outcome": {
            "$ref": "#/components/schemas/ScheduledReportCaptureOutcome"
          },
          "refusalCode": {
            "description": "Why the capture was refused, for REFUSED.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ScheduledReportCaptureRefusal"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "reportRunId": {
            "description": "The fire's Report run, for CAPTURED and ALREADY_CAPTURED.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "outcome"
        ],
        "type": "object"
      },
      "CatalogParableSchemaStatusEnum": {
        "description": "Whether a parables-pool entry carries a derived schema. This is the\ndiscriminator, not fields.length: an UNKNOWN entry and a table with zero\ncolumns both serialize `fields: []`, and only this field separates \"no save\nhas ever derived a schema\" (spec 0084 \"Null and stale schemas\") from a real\nempty shape. Read it first.\n\nUPPER values even though it sits beside the lowercase CatalogPoolEnum: these\nare status words, not SQL identifiers, nothing external supplies the string,\nand the CatalogSnapshot round-trip acceptance case names UNKNOWN literally.",
        "enum": [
          "DERIVED",
          "UNKNOWN"
        ],
        "type": "string"
      },
      "CatalogPoolEnum": {
        "description": "The addressable CATALOGS of the v2 catalog: the legal first segment of a\nfully qualified reference, and therefore what PlotTableReference.pool carries.\nValues are the literal SQL identifiers, so a reference reconstructs its own\nfirst segment without a case-mapping table. Same lowercase-value convention as\nCatalogTableKindEnum and CatalogTapKindEnum beside it. The values are\nload-bearing SQL text: a casing change here is a silent runtime break.\n\nThe member set is EXACTLY `ALLOWED_PROVIDER_CATALOGS`\n(services/query-layer/src/v2_catalog.rs): six catalogs, every one of them\nexecutable in consumer SQL today, and\n`allowed_provider_catalogs_are_catalog_pool_enum_members` in v2_catalog.rs\nasserts the two sets are equal in both directions. `workspace` was the\nreserved member until PARABLE-2062 made it an executable flat catalog of\nconnector-config projections (v2_workspace.rs, served in-memory from the\nconnector inventory); it is no longer reserved and no longer the odd one\nout. EDR-0080's three POOLS plus EDR-0081's workspace are a different\ngrouping; this enum is keyed on catalogs because addressing is what a\nreference carries. EDR-0080's providers pool is served by THREE catalogs --\n`providers`, `providers_quarantine` and `providers_quality` -- and all three\nare concatenated into CatalogSnapshot.tables by the same builder\n(v2_semantic_catalog.rs:93-110). Omitting the quarantine and quality members\nwould make `providers_quarantine.github.issues`, which executes today, earn a\nclass-ERROR PV_REF_001 and become un-publishable.\n\nTHE MEMBER IS ALSO THE DISAMBIGUATOR, not just an addressing convenience.\n`SemanticCatalogTable.schemaName` and `.logicalName` are copied verbatim per\ncatalog by `project_table` (v2_semantic_catalog.rs:158-159), so a quarantine\nmirror shares BOTH with its main table -- the engine's own test asserts that\n`(providers, \"issues\")` and `(providers_quarantine, \"issues\")` coexist for one\nconnector (`golden_full_catalog_metadata_covers_all_table_populations` in\nv2.rs, `semantic_catalog_serves_identity_and_table_kinds` in\nv2_semantic_catalog.rs). `(schemaName, tableName)` is therefore NOT a\nunique key into CatalogSnapshot.tables; `(pool, schemaName, tableName)` is,\nbecause pool is exactly the entry's `catalog`. A resolver that ignores the\npool can derive a Plot's schema from a quarantine mirror and its `_parable_*`\nenvelope columns instead of the table the author meant.\n\nPROVIDERS, PROVIDERS_QUARANTINE, PROVIDERS_QUALITY and PARABLES are three-part\n(`providers.{schemaName}.{tableName}`). ARTIFACTS and WORKSPACE also accept a\nflat two-part form -- `artifacts.{table}` (EDR-0080:118-121),\n`workspace.parent_data_filters` (v2_workspace.rs, WORKSPACE_IMPLICIT_SCHEMA is\nthe same \"public\" as artifacts) -- which is why PlotTableReference.schemaName\nis nullable.\n\n\"Flat\" means the two-part form is LEGAL, not that it is the only form. For\nartifacts it is sugar: `artifacts.{table}` is rewritten to\n`artifacts.public.{table}` by rewrite_artifacts_two_part_sql\n(services/query-layer/src/v2_artifacts.rs:148-178), with\nARTIFACTS_IMPLICIT_SCHEMA = \"public\" (:33-34). `artifacts.public.my_upload` is\nequally legal authored SQL and carries schemaName: \"public\". A consumer that\nreads \"artifacts is flat\" as \"schemaName is always null there\" will either\nreject the three-part form or normalize it away, and the fully qualified name\nit reconstructs stops matching the SQL the author wrote.\n\nEvery member now has a CatalogSnapshot field. ARTIFACTS and WORKSPACE were the\nlast two without one; PARABLE-3240 and PARABLE-3220 added them, both typed\nSemanticCatalogTable[] and both filled by project_pool_tables\n(services/query-layer/src/v2_semantic_catalog.rs). A reference into any pool\ntherefore resolves, or does not, on the CONTENT of that pool's field rather\nthan on the absence of the field: `workspace.parent_data_filters` and\n`workspace.users` (a generated projection, PARABLE-3964) resolve because\nthe live producer serves those tables, and `workspace.sql_plots` does not\nbecause it does not serve that one yet. See CatalogSnapshot for the\nelement-type evidence.",
        "enum": [
          "providers",
          "providers_quarantine",
          "providers_quality",
          "artifacts",
          "parables",
          "workspace"
        ],
        "type": "string"
      },
      "CatalogSnapshot": {
        "description": "A serializable projection of everything SQL can see, server-assembled and\nversion-stamped. The R8 save path builds it natively; the editor fetches the\nsame builder's output from the Parable-scoped read endpoint (PARABLE-2703)\nand splices unsaved drafts locally.\n\nSpec 0084 \"The catalog snapshot\" defines it as \"the existing\nSemanticCatalogResponse plus: the parables pool; the workspace pool;\ncontract_version\". This type\ncarries the SemanticCatalogResponse fields the validator needs -- tenantSlug,\ncatalogVersion, tables, views -- plus parables plus its own contractVersion.\nIt does not embed SemanticCatalogResponse, because the snapshot is assembled\nfor the validator and is not the REST response object.\n\nBOTH remaining pools now carry a field -- `artifacts` (PARABLE-3240) and\n`workspace` (PARABLE-3220) -- and both are SemanticCatalogTable[]. The element\ntype is EVIDENCED, not a default:\n* ProviderCatalog.artifact_tables and ProviderCatalog.workspace_tables are\nboth Vec\u003cProviderTable\u003e (services/query-layer/src/v2_catalog.rs), the same\nelement type project_table already consumes for the three provider\ncatalogs, and both carry Arrow schemas.\n* project_table's primary-key and foreign-key branches are gated on\ncatalog_name == PROVIDERS_CATALOG (v2_semantic_catalog.rs), so they degrade\nto null and empty for these pools instead of demanding another shape.\n* Artifact schema_name is its authorized publication namespace, with\nlegacy uploads in `public`; workspace uses `public`. Both labels map to legal\nCatalogTapKindEnum members: `artifact` and `derived`.\nEDR-0081 is still Proposed and decides no entry shape -- its field table is\nheaded \"Fields (indicative)\" and the psgen projection-schema entity kind it\ndepends on is unbuilt. It does state that the future psgen path emits the Rust\ntypes and Arrow schema the query-layer registers, which is what\nSemanticCatalogField carries, and it incorporates PARABLE-2062's live producer\nrather than superseding it. Both producer paths land on the same element type,\nwhich is the condition the earlier deferral protected.\n\nEach entry's `catalog` field says which pool it came from and IS EXPECTED TO\nagree with the field it sits in. Expected to, not MUST: `catalog` is a bare\nstring whose vocabulary is CatalogPoolEnum, nothing validates it, and the\nsnapshot index treats the FIELD as the authority -- see\nan_entry_whose_catalog_disagrees_with_its_field_is_still_indexed_by_its_field\nin services/pkg/plot-validator-rs/src/snapshot.rs, which deliberately codifies\ntolerating the disagreement. Retyping `catalog` to CatalogPoolEnum is the real\nfix; it is a NARROWING of a type shared with the REST metadata response and is\ndeferred rather than done here.\n\nThe ordering constraint spec 0084 stated for both pools is DISCHARGED.\nPARABLE-2696 no longer has to choose between landing the pools and suppressing\nREFERENCE gating: SQL over either now resolves against a served field instead of\nearning a false class-ERROR PV_REF_002.\n\nRECORDED AS DELETED, so it is not reintroduced from ticket history: an earlier\ndraft claimed the literal \"public\" these tables carry does not fit\nSemanticCatalogTable.schemaName's Connector.Slug. That claim was FALSE --\n`public` matches the pattern, is 6 characters against a 32 maximum, and is not\namong the reserved words `identity` and `artifacts`. PARABLE-3260 has since\nretyped schemaName to Identity.Slug, so the point is moot either way.",
        "properties": {
          "artifacts": {
            "description": "Artifact pool tables (EDR-0080), served as artifacts.{namespace}.{table}.\nOrdinary snapshots include each publication namespace's active revision. Same type as `tables` because the\nproducer is the same project_table: ProviderCatalog.artifact_tables is\nVec\u003cProviderTable\u003e, and project_table's primary-key and foreign-key branches\nare providers-gated, so they degrade to null and empty here.\n\nHAZARD, recorded not fixed (PARABLE-3220): these entries' field names are\nCUSTOMER-CONTROLLED. v2_artifacts.rs copies field names straight out of the\nuploaded artifact's output_schema with no length fold, while\nSemanticCatalogField.name is Identity.Name (min_length 2, max_length 80). A\nspreadsheet column named `Q`, or a survey header over 80 characters, produces\na field name the generated Validate() rejects -- the same argument the\nParablePoolField block above makes for the parables pool, and the reason\nservices/query-layer/tests/catalog_snapshot_contract.rs deliberately carries a\none-character column name. Giving the artifacts pool its own field shape is a\ncontract decision on the scale of D-16 and is deferred;\nartifact_pool_columns_are_not_folded_to_identity_name in\nservices/query-layer/src/v2_semantic_catalog.rs records the observed behaviour\nat both boundaries.\n\nlogicalName note: for this pool the value is sanitize_identifier(catalog_slug)\n(v2_artifacts.rs), which is a Parable.CatalogSlug by construction. The field\nSTAYS `string` because it is shared with the provider pools, where it carries\na tap stream name under different naming rules. Recorded so a future reader\nneither retypes the shared field nor assumes no scalar applies. PARABLE-3240.",
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogTable"
            },
            "type": "array"
          },
          "catalogVersion": {
            "description": "Structure-only catalog fingerprint, copied verbatim from\nSemanticCatalogResponse.catalogVersion. Carried because spec 0084 \"Surfaces\"\nrequires the editor to cache the snapshot per session, and\n(tenantSlug, catalogVersion) is the documented cache key\n(semantic-catalog-response.schema.ts:143-146). Dropping it would remove a\nmechanism the spec depends on.",
            "type": "string"
          },
          "contractVersion": {
            "description": "Bumped when the snapshot SHAPE or its assembly changes, so a client holding\na stale snapshot is detectable rather than silently wrong. EQUALITY\ncomparison only, never ordering; the canonical form is an opaque string.\n\nOWNER: the validator crate owns the value as SNAPSHOT_CONTRACT_VERSION in\nservices/pkg/plot-validator-rs/src/snapshot.rs (PARABLE-3222), for the same\nreason it owns the severity defaults -- psgen emits no constants into\nbindings, so without a named owner every producer hard-codes its own literal\nand the staleness warning the spec promises never fires. Every producer reads\nthat const, and a deny-by-default repo scan\n(no_plot_validation_literal_escapes_the_owner) fails when any file outside a\nnamed exception list stamps a different one.\n\nBUMP RULE, recorded in full in spec 0084: bumped when a field is ADDED,\nREMOVED or RETYPED here, when the ASSEMBLY RULE for an existing field\nchanges, or when the ACCEPTED VALUE DOMAIN of a borrowed field changes. Not\nbumped for a doc-comment change, a field reordering, or a change confined to a\nborrowed type's own contract that leaves the accepted set alone. The current\nvalue `plot-validation/2` covers BOTH the two pool fields below AND\nPARABLE-3260's retype of the borrowed SemanticCatalogTable.schemaName from\nConnector.Slug to Identity.Slug, which adds no field but changes what the wire\naccepts.\n\nIt is NOT the same counter as SemanticCatalogResponse.contractVersion, which\nis the catalog metadata contract version. See PlotValidationResult.contractVersion.",
            "type": "string"
          },
          "parables": {
            "items": {
              "$ref": "#/components/schemas/ParablePoolEntry"
            },
            "type": "array"
          },
          "tables": {
            "description": "Provider-pool tables, exactly as SemanticCatalogResponse.tables serves them:\nthe catalogs `providers`, `providers_quarantine` and `providers_quality`.\nThe `catalog` field on each entry says which.\n\nSemanticCatalogTable.schemaName is Identity.Slug (PARABLE-3260, resolved):\nthe field carries a catalog schema segment, so `identity` and `public` are\nlegal values and the earlier Connector.Slug typing was the defect. Nothing\nis inherited from that reading any more.\n\nONE CONSTRAINT IS STILL INHERITED WITH THE TYPE, not created here, deferred\n(scalar G4):\n* psgen's generated Go Validate() treats a required array with len()==0 as\na MISSING field (the `len(...) == 0` branch in each generated\nValidate()). Every\ndocumented-empty state of this contract -- tables: [], views: [],\nfields: [] on an UNKNOWN entry, a clean Plot's empty diagnostics, the\nempty severityOverrides that means \"launch defaults\" -- is therefore\nGo-invalid and TS-valid. These objects are not run through Go\nValidate() today; PARABLE-2696 is the first consumer that would.\nPARABLE-3258.\n\nThe two pool fields raise this from an edge case to the common path.\n`tables` is non-empty for any tenant with a connector, so today the\nhazard rarely fires. `artifacts` is empty for every tenant with no\nuploads and `workspace` for every tenant with no connector config, so\nTWO of the five required arrays on this type are now empty by DEFAULT.\nPARABLE-2696 must resolve PARABLE-3258 before running generated Go\nValidate() over a snapshot.\nRESOLVED: PARABLE-3258 landed with #6120; required now means present,\nnot non-empty, in every language, and the Go clients validate.",
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogTable"
            },
            "type": "array"
          },
          "tenantSlug": {
            "description": "Tenant the snapshot belongs to. Same type and same value as\nSemanticCatalogResponse.tenantSlug.\n\nINHERITED HAZARD (scalar G3, deferred as PARABLE-3260): the semantic\ncatalog's producer can emit a value this scalar rejects. Parable.Slug has\nmin_length 1 and pattern ^[a-z0-9]+(?:-[a-z0-9]+)*$\n(utils/scalar-lib/core/src/catalog.rs:1245-1272), and\nservices/query-layer/src/v2_semantic_catalog.rs:139 builds it as\n`tenant.tenant_slug.clone().unwrap_or_default()` over an Option\u003cString\u003e\n(control_plane/mod.rs:16), so a request that selects a tenant by id yields\n\"\". The SNAPSHOT BUILDER (PARABLE-2696, which is where the builder lives;\nPARABLE-2691 shipped the validator crate and no builder) must fail rather\nthan emit an empty tenantSlug. Stated here so the builder inherits the\nrequirement instead of rediscovering it.",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "views": {
            "description": "LOG-3 convenience views, exactly as SemanticCatalogResponse.views serves\nthem. Carried because they are referenceable SQL objects: without them a\nPlot selecting from a view gets a false PV_REF_002, against the spec's\nstated \"never produces a false error\" posture. SemanticCatalogView has no\ncatalog field; the producer registers views under PROVIDERS_CATALOG only\n(v2_semantic_catalog.rs:116-136), so a view is addressed\nproviders.{schemaName}.{logicalName}.",
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogView"
            },
            "type": "array"
          },
          "workspace": {
            "description": "Workspace pool tables (EDR-0081 / PARABLE-2062): connector-config projections\nand parent_data_filters, served in memory from the connector inventory under\nthe flat `workspace` catalog with the same implicit `public` schema. Same\nelement type and the same reason. Column names here are platform-generated, so\nthe Identity.Name hazard above does not apply. PARABLE-3220.",
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogTable"
            },
            "type": "array"
          }
        },
        "required": [
          "contractVersion",
          "tenantSlug",
          "catalogVersion",
          "tables",
          "views",
          "artifacts",
          "workspace",
          "parables"
        ],
        "type": "object"
      },
      "CatalogTableKindEnum": {
        "description": "Position of a served table in a tap's mapping plan (query-layer v2\ncatalog metadata contract). Mirrors the vocabulary served under the\nFlight `parable.annotation.table_kind` schema metadata key; the Rust\nsource of truth is `services/query-layer/src/metadata_contract.rs`\n(`CatalogTableKind`).",
        "enum": [
          "main",
          "quarantine",
          "child",
          "child_quarantine"
        ],
        "type": "string"
      },
      "CatalogTableStats": {
        "description": "PARABLE-4947: each served Provider table's size, freshness and quality for a\ncatalog browser, keyed by the address the semantic catalog serves it under.\nThe browser renders the table list from `catalog` and fills these values in\nwhen this answers, so this read never holds the list.\n\nEvery value comes from Query Layer's caches: shape stats from the\n`_maintenance/stats` sidecar each table's maintenance run writes, quality\nfrom its `_maintenance/quality` sidecar, and freshness from the provider\nannotations. A null value is unknown or not yet measured, never zero.\nOne served table's measurements.",
        "properties": {
          "catalog": {
            "description": "The address the semantic catalog serves the table under\n(SemanticCatalogTable.catalog / schemaName / logicalName).",
            "type": "string"
          },
          "logicalName": {
            "type": "string"
          },
          "materialized": {
            "description": "Whether a writer has created the table. Same value as\nSemanticCatalogTable.materialized.",
            "nullable": true,
            "type": "boolean"
          },
          "qualityCheckedAt": {
            "description": "When that quality run finished.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "qualityStatus": {
            "description": "The outcome of the table's latest quality run.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/QualityRunStatus"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "rowCount": {
            "description": "Rows in the table when maintenance last measured it.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "schemaName": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "statsCapturedAt": {
            "description": "When maintenance measured rowCount and totalByteSize.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "totalByteSize": {
            "description": "Bytes the table's data files hold, from the same measurement.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "watermark": {
            "description": "The completeness watermark: the table holds the Provider's data through\nthis time. Same value as SemanticCatalogTable.watermark.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "catalog",
          "schemaName",
          "logicalName"
        ],
        "type": "object"
      },
      "CatalogTableStatsResponse": {
        "description": "Every served Provider table's measurements for one Workspace.",
        "properties": {
          "catalogVersion": {
            "description": "The catalog the addresses below were resolved against.",
            "type": "string"
          },
          "tables": {
            "items": {
              "$ref": "#/components/schemas/CatalogTableStats"
            },
            "type": "array"
          },
          "tenantSlug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "tenantSlug",
          "catalogVersion",
          "tables"
        ],
        "type": "object"
      },
      "CatalogTapKindEnum": {
        "description": "The tap-kind vocabulary of the query-layer v2 catalog metadata contract,\nserved under the Flight `parable.annotation.tap_kind` schema metadata key.\nThe Rust source of truth is `services/query-layer/src/metadata_contract.rs`\n(`tap_kind_label` / `TAP_KIND_DERIVED`). This is a superset of\nTenantConnectorTapKindEnum: served tables are either backed by a tenant\nconnector tap (the EDR-0021 kinds) or synthesized by the platform (DERIVED).",
        "enum": [
          "override",
          "custom",
          "artifact",
          "derived"
        ],
        "type": "string"
      },
      "ChangeParableProblemLifecycleInput": {
        "description": "Revision-checked, idempotent transition of the reversible Problem lifecycle.",
        "properties": {
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedProblemRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ChangeParableProblemPinnedPageInput": {
        "description": "Pin or unpin one Page. Both are set operations: pinning a pinned Page or\nunpinning one that is not pinned succeeds and changes nothing.",
        "properties": {
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pageId": {
            "description": "The Page Piece's id.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "pageId",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "CloseParableProblemPingInput": {
        "properties": {
          "expectedPingRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedPingRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ColumnShapeStats": {
        "description": "Per-column snapshot. Embedded in TableShapeStats; not stored\nindependently.",
        "properties": {
          "arrowType": {
            "description": "Arrow physical type for the column (e.g. \"Int64\", \"Utf8\",\n\"Timestamp(Microsecond, Some(\\\\\"UTC\\\\\"))\"). Mirrors DataFusion's\narrow_schema().field(...).data_type() display form.",
            "type": "string"
          },
          "avg": {
            "description": "Numeric-only summaries. Null for non-numeric columns.\nq25/q50/q75 are computed via DataFusion approx_percentile_cont; they\nmay diverge from polars exact quantiles in edge cases (documented\nparity divergence, see Step 1 acceptance test).",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "columnName": {
            "description": "Column name as it appears in the contract's outputSchema.",
            "type": "string"
          },
          "distinctCount": {
            "description": "Distinct count. Exactness governed by\nTableShapeStats.distinctCountsExact. Null when the column type does\nnot support a distinct count (nested List/Struct/Map/Union), for\nengine-owned columns, and when the run sampled the table\n(TableShapeStats.sampledRowCount); absent must not be treated as 0 by\nquality rules or SPC series.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "maxValue": {
            "nullable": true,
            "type": "string"
          },
          "minValue": {
            "description": "Min / max as ISO-string-cast values to keep the response JSON-friendly.\nNumeric callers parse to f64 at read time. Null when the column has\nzero non-null rows.",
            "nullable": true,
            "type": "string"
          },
          "nonNullCount": {
            "description": "Non-null row count for the column. Equals rowCount minus null count.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "nullPct": {
            "description": "Null percentage in [0.0, 100.0], rounded to two decimals to match the\nshape_capture writer's behaviour.",
            "format": "double",
            "type": "number"
          },
          "parableScalar": {
            "description": "The Parable scalar from the contract outputSchema for this column\n(canonical name like \"Identity.UUID\" or \"Generic.Int64\"). New in\nTableShapeStats vs the EDR-0031 ContractColumnStats shape. Null when\nthe contract outputSchema does not declare a Parable scalar for the\ncolumn (the Arrow type in `arrowType` is the only signal in that case).",
            "maxLength": 128,
            "minLength": 3,
            "nullable": true,
            "pattern": "^[A-Z][A-Za-z0-9]*\\.[A-Z][A-Za-z0-9]*$",
            "type": "string"
          },
          "q25": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "q50": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "q75": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "std": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "validationFailureCount": {
            "description": "Count and percentage of values that failed scalar/contract validation for\nthis column during the latest maintenance capture.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "validationFailurePct": {
            "format": "double",
            "type": "number"
          }
        },
        "required": [
          "columnName",
          "arrowType",
          "nonNullCount",
          "nullPct",
          "validationFailureCount",
          "validationFailurePct"
        ],
        "type": "object"
      },
      "CompleteArtifactUploadInput": {
        "additionalProperties": false,
        "properties": {
          "artifactId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "artifactId"
        ],
        "type": "object"
      },
      "CompleteArtifactWorkResult": {
        "properties": {
          "accepted": {
            "type": "boolean"
          }
        },
        "required": [
          "accepted"
        ],
        "type": "object"
      },
      "CompleteParableProblemMessageInput": {
        "additionalProperties": false,
        "description": "The terminal record of one ordinary Ponder exchange. The AI SDK UIMessage is\na third-party boundary carried as JSON; web-api checks its identity and role\nbefore storing it beside the product parts.",
        "properties": {
          "assistantMessageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parts": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemMessagePart"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array"
          },
          "sessionEntries": {
            "description": "pi session entries this exchange appended, in order, header first on a new\njournal. web-api appends them to the Problem's journal with the Message.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "maxItems": 100000,
            "minItems": 0,
            "type": "array"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemMessageStatusEnum",
            "description": "streaming, completed, failed, or cancelled; pending is refused."
          },
          "uiMessage": {
            "description": "Public AI SDK UIMessage; historical product parts remain a compatibility projection.",
            "nullable": true
          },
          "userMessageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "assistantMessageId",
          "userMessageId",
          "status",
          "parts",
          "sessionEntries"
        ],
        "type": "object"
      },
      "CompleteParableProblemRunInput": {
        "properties": {
          "artifactIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "duration": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "errorCode": {
            "description": "Application error code",
            "maxLength": 50,
            "nullable": true,
            "pattern": "^[A-Z_][A-Z0-9_]*$",
            "type": "string"
          },
          "errorMessage": {
            "nullable": true,
            "type": "string"
          },
          "errorRetryable": {
            "nullable": true,
            "type": "boolean"
          },
          "expectedRunRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "externalCallCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "finalParts": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemMessagePart"
            },
            "minItems": 1,
            "type": "array"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "inputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "modelExecutions": {
            "items": {
              "$ref": "#/components/schemas/SafeModelExecution"
            },
            "maxItems": 128,
            "minItems": 0,
            "type": "array"
          },
          "modelRequestCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "outputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "summary": {
            "description": "Markdown text",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "workflowAdapter": {
            "$ref": "#/components/schemas/ParableProblemRunAdapterEnum"
          },
          "workflowRunId": {
            "type": "string"
          }
        },
        "required": [
          "expectedRunRevision",
          "idempotencyKey",
          "workflowAdapter",
          "workflowRunId",
          "finalParts",
          "modelExecutions"
        ],
        "type": "object"
      },
      "CompleteTenantOnboardingInput": {
        "properties": {
          "organizationSize": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/OrganizationSize"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "organizationWebsite": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "CompleteUserOnboardingInput": {
        "properties": {
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "title": {
            "nullable": true,
            "type": "string"
          },
          "workFunction": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WorkFunction"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "workRole": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WorkRole"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "type": "object"
      },
      "ComposedCommitRef": {
        "properties": {
          "commitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableRevisionRefKindEnum"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "parableId",
          "commitId"
        ],
        "type": "object"
      },
      "ComposedRefRevisionRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableRevisionRefKindEnum"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "parableId",
          "refId",
          "refRevision"
        ],
        "type": "object"
      },
      "ConfigureConnectorInput": {
        "properties": {
          "authenticationConfig": {
            "description": "A Parable Schema in JSON",
            "nullable": true,
            "type": "object"
          },
          "authenticationStrategyId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ingestionConfig": {
            "description": "A Parable Schema in JSON",
            "nullable": true,
            "type": "object"
          },
          "parentDataFilters": {
            "description": "Workspace allowlist: one predicate per parent tap.",
            "items": {
              "$ref": "#/components/schemas/TenantParentDataFilterEntryInput"
            },
            "nullable": true,
            "type": "array"
          },
          "tenantConnectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantConnectorId"
        ],
        "type": "object"
      },
      "ConfigureConnectorResult": {
        "description": "Result of configuring a connector",
        "properties": {
          "credentialMetadataId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "success": {
            "type": "boolean"
          }
        },
        "required": [
          "success",
          "credentialMetadataId",
          "message"
        ],
        "type": "object"
      },
      "ConfigureScimResult": {
        "description": "SCIM mutation result types (web-api)",
        "properties": {
          "bearerToken": {
            "type": "string"
          },
          "connectionId": {
            "type": "string"
          }
        },
        "required": [
          "connectionId",
          "bearerToken"
        ],
        "type": "object"
      },
      "ConfirmSourceAccountLinkInput": {
        "additionalProperties": false,
        "description": "Links one source account to the member who signs in with `email`.",
        "properties": {
          "email": {
            "description": "The email the member signs in with.",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "principalKey": {
            "description": "The account's principal key, `user:\u003csource id\u003e`, as the Unlinked\naccounts view lists it.",
            "maxLength": 1024,
            "minLength": 6,
            "type": "string"
          },
          "providerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "providerKey",
          "principalKey",
          "email"
        ],
        "type": "object"
      },
      "Connector": {
        "description": "Web Types of the Connector, see the db types for main reference",
        "properties": {
          "addressingConfig": {
            "description": "API addressing configuration. Per-strategy addressingConfig on the active\nConnectorAuthStrategy overrides this.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/AddressingConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "apiVersion": {
            "description": "API version for documentation and compatibility",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "defaultAudience": {
            "description": "The audience of every tap that has no anchor and no audience of its own.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorDefaultAudienceEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "defaultBaseUrl": {
            "description": "Default base URL for API calls (can be overridden per-tenant)",
            "format": "uri",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "description": {
            "description": "Description of what this connector does",
            "nullable": true,
            "type": "string"
          },
          "effortMetadata": {
            "description": "── Effort Estimation ────────────────────────────────────────────────\nStructured effort estimation metadata (bucket, confidence, breakdown)",
            "nullable": true
          },
          "fieldDiscovery": {
            "description": "Configuration for runtime field discovery. When present, wildcard tokens in SOQL/queries are resolved by calling a describe endpoint.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/FieldDiscoveryConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "inboundAuthStrategies": {
            "description": "Inbound sender verification strategies (collector / push-ingestion\nconnectors only; absent for pull connectors)",
            "items": {
              "$ref": "#/components/schemas/InboundAuthStrategy"
            },
            "nullable": true,
            "type": "array"
          },
          "ingestionConfigSchema": {
            "description": "Schema for the required ingestion params for the customer to setup this connector",
            "nullable": true,
            "type": "object"
          },
          "integrationClass": {
            "description": "High-level integration class determining how data is extracted",
            "oneOf": [
              {
                "$ref": "#/components/schemas/IntegrationClassEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "name": {
            "description": "Human-readable connector name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "parallelParentFetch": {
            "description": "Whether parent fan-out may run concurrently.",
            "type": "boolean"
          },
          "permissionModel": {
            "description": "Access-gating model compiled into the immutable ingestion execution plan.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorPermissionModelEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "protocolType": {
            "description": "API protocol type (rest, graphql, webhook, otlp, agent, ...)",
            "nullable": true,
            "type": "string"
          },
          "rateLimits": {
            "description": "Global rate limits (can be overridden per-tap)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorRateLimits"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "releaseStatus": {
            "$ref": "#/components/schemas/ConnectorLifecycleStatusEnum",
            "description": "── Lifecycle ──────────────────────────────────────────────────────────"
          },
          "setupDocumentation": {
            "description": "── Customer facing ─────────────────────────────────────────────────────\nMarkdown document for a customer setting up this connector",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "slug": {
            "description": "── Identity ──────────────────────────────────────────────────────────\nUnique slug for this connector it is made of up of the first 8 characters\nof the taps name + _ + 8 random base62 characters",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "supportedAuthStrategies": {
            "description": "── Composable Components ──────────────────────────────────────────────\nSupported authentication strategies",
            "items": {
              "$ref": "#/components/schemas/ConnectorAuthStrategy"
            },
            "type": "array"
          },
          "taps": {
            "description": "Available taps (data streams)",
            "items": {
              "$ref": "#/components/schemas/ConnectorTap"
            },
            "type": "array"
          },
          "timeoutSeconds": {
            "description": "HTTP request timeout in seconds (default: 30).\nIncrease for APIs that return large payloads slowly\n(e.g., Workday RaaS custom reports: 30-90s).",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "traversal": {
            "description": "Traversal graph defining tap DAG relationships. Omit for flat connectors (all taps are roots with no edges).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorTraversalConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "validationEndpoint": {
            "description": "Full URL for the credential-validation probe (a lightweight authenticated\nGET that returns 401/403 for a bad credential, 2xx for a good one); empty\nmeans probe defaultBaseUrl directly.",
            "format": "uri",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "visibilityModel": {
            "$ref": "#/components/schemas/ConnectorVisibilityModelEnum",
            "description": "How the source decides which of its own users may see a record\n(EDR-0095). A stored connector with no value reads as not_modeled."
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "slug",
          "name",
          "supportedAuthStrategies",
          "parallelParentFetch",
          "taps",
          "visibilityModel",
          "releaseStatus"
        ],
        "type": "object"
      },
      "ConnectorAuthStrategy": {
        "description": "Authentication strategy row for a connector.\nEach strategy is persisted as its own record to support stable identity.",
        "properties": {
          "addressingConfig": {
            "description": "Per-strategy API addressing configuration. Overrides the connector-level\naddressingConfig when this strategy is active. Variables with source=user_input\nmust resolve from configSchema, this strategy's ingestionConfigSchema, or the\nconnector's ingestionConfigSchema.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/AddressingConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "apiKeyConfig": {
            "description": "API key settings (when type = API_KEY_HEADER or API_KEY_QUERY)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ApiKeyAuthConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "basicConfig": {
            "description": "Basic auth settings (when type = BASIC)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/BasicAuthConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "bearerConfig": {
            "description": "Bearer token settings (when type = BEARER)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/BearerAuthConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "configSchema": {
            "description": "Strategy-specific customer config schema",
            "nullable": true,
            "type": "object"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "credentialProbe": {
            "description": "Declarative credential check for this strategy (PARABLE-4273). When set,\ncredential validation runs it instead of a dedicated or generic probe.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/CredentialProbeWorkflow"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "defaultBaseUrl": {
            "description": "Per-strategy base URL override. Takes precedence over the connector-level\ndefaultBaseUrl when this strategy is active.",
            "format": "uri",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "defaultScopes": {
            "description": "Default OAuth2 scopes for this auth strategy",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "delegatedUserField": {
            "description": "Ingestion config field name for delegated user email (DWD)",
            "nullable": true,
            "type": "string"
          },
          "docs": {
            "description": "Per-strategy setup documentation (Markdown). When set, the web-app docs pane\nprefers this over the vendor-grouping docs for the selected auth method.",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "extraHeaders": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Additional headers to include in all authenticated requests",
            "nullable": true,
            "type": "object"
          },
          "hook": {
            "description": "Optional hook reference executed for auth strategy behavior",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ingestionConfigSchema": {
            "description": "Per-strategy ingestion config schema. When set, overrides the connector-level\ningestionConfigSchema for tenant connectors using this auth strategy.",
            "nullable": true,
            "type": "object"
          },
          "label": {
            "description": "Display label for this strategy in setup flows",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "oauth2Config": {
            "description": "OAuth2 settings (when type = OAUTH2_CLIENT_CREDENTIALS or OAUTH2_REFRESH)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/OAuth2AuthConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "preEncodedBasicConfig": {
            "description": "Pre-encoded basic auth settings (when type = BASIC with pre-encoded token)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PreEncodedBasicAuthConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "support": {
            "description": "Whether customers may use this strategy (PARABLE-4173). Unset means\nsupported when the backends run its type for this connector.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/AuthStrategySupportEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "type": {
            "$ref": "#/components/schemas/AuthMethodEnum",
            "description": "Authentication method"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "type"
        ],
        "type": "object"
      },
      "ConnectorCategory": {
        "description": "A business function category a connector can belong to.\nLabels come from the DB -- no client-side label map needed.",
        "properties": {
          "children": {
            "items": {
              "$ref": "#/components/schemas/ConnectorCategory"
            },
            "type": "array"
          },
          "connectorIds": {
            "description": "IDs of connectors that belong to this category via ConnectorCategoryRelationship.\nUsed by the DYNAMIC_TOOL_GROUPS picker to filter active categories and show per-category logos.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isLegacy": {
            "description": "Legacy categories remain available for saved onboarding selections.",
            "type": "boolean"
          },
          "label": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "parent": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorCategory"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "sortOrder": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "slug",
          "label",
          "sortOrder",
          "isLegacy",
          "children",
          "connectorIds"
        ],
        "type": "object"
      },
      "ConnectorConfigFanout": {
        "description": "Declares how a list-valued ingestion config field drives root-tap fan-out.",
        "properties": {
          "configField": {
            "description": "Ingestion config property name (e.g. team_ids).",
            "type": "string"
          },
          "separator": {
            "description": "Separator for legacy string config values. Defaults to comma when omitted.\nArray config values ignore this field.",
            "nullable": true,
            "type": "string"
          },
          "templateVariable": {
            "description": "Endpoint placeholder name (e.g. team_id).",
            "type": "string"
          }
        },
        "required": [
          "configField",
          "templateVariable"
        ],
        "type": "object"
      },
      "ConnectorCredentialDetail": {
        "description": "Credential error detail for a connector instance.\nReturned by tenantConnectorCredentialDetail when connectionStatus is CREDENTIAL_ERROR.",
        "properties": {
          "errorCode": {
            "description": "Error code from the most recent failed credential validation.\nSourced from credential_validation_result.error_code (type ValidationErrorCode).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ValidationErrorCode"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "errorMessage": {
            "description": "Human-readable message from the most recent failed credential validation.",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "ConnectorDefaultAudienceEnum": {
        "description": "The audience of a tap that has no anchor and no audience of its own\n(EDR-0095). Declared on a connector for all of its taps, or on one tap.",
        "enum": [
          "source_users",
          "unrestricted"
        ],
        "type": "string"
      },
      "ConnectorEdge": {
        "description": "A directed edge in the tap DAG from a parent tap to a child tap.\nDefines how records from the parent are used to construct requests for the child.",
        "properties": {
          "fanOutLimit": {
            "description": "Maximum number of child requests to fan out per parent record.\nUseful for rate-limit-sensitive connectors.",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "from": {
            "description": "Parent tap name (source of the edge)",
            "maxLength": 80,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9_]*$",
            "type": "string"
          },
          "parentContextFields": {
            "description": "Mappings to inject parent record values into child records.\nEach entry maps a target field (set on child) to a source field (read from parent).\nEnables multi-field context propagation through tap hierarchies.",
            "items": {
              "$ref": "#/components/schemas/ParentContextFieldMapping"
            },
            "nullable": true,
            "type": "array"
          },
          "parentEligibility": {
            "description": "Optional eligibility predicates evaluated against each parent record before\nany child request is planned. All predicates must hold for the parent to be\nfanned out. `any_of` keeps allowlist semantics (a missing value matches\nnothing); the comparison operators fail open on a missing field or a value\nof the wrong type, so an incomplete payload never silently drops data.",
            "items": {
              "$ref": "#/components/schemas/ParentEligibilityPredicate"
            },
            "nullable": true,
            "type": "array"
          },
          "parentKeyField": {
            "description": "Field from the parent record used to construct the child tap's request.\nExamples: 'full_name' (GitHub repos → issues), 'id' (Slack channels → messages)",
            "type": "string"
          },
          "parentsPerRequest": {
            "description": "Parent records served by one child request. Null or 1 sends one request\nper parent. Above 1, each request carries up to this many parents: a\nparent placeholder written as a whole list element in the request body,\nquery params, or GraphQL variables (e.g. \"userIds\": [\"{id}\"]) expands to\nevery parent value in the group. Use it for Provider endpoints that accept\nan id list and compute over every id they receive (Gong\n/v2/stats/activity/*), where one request per parent, or one unscoped\nrequest, is too slow. Rows cannot be attributed to a single parent, so a\ngrouped edge takes no parentContextFields.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "templateVariable": {
            "description": "Template variable name in the child tap's endpoint.\nIf omitted, defaults to parentKeyField.\nExample: endpoint '/repos/{full_name}/issues' uses templateVariable 'full_name'",
            "nullable": true,
            "type": "string"
          },
          "to": {
            "description": "Child tap name (target of the edge)",
            "maxLength": 80,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9_]*$",
            "type": "string"
          }
        },
        "required": [
          "from",
          "to",
          "parentKeyField"
        ],
        "type": "object"
      },
      "ConnectorInstancesForVendor": {
        "description": "Connector instances grouped by vendor (tenant-scoped).\nUse connectorInstancesForVendors query to fetch without modifying vendor types.",
        "properties": {
          "connectorInstances": {
            "description": "Connector instances configured for this vendor",
            "items": {
              "$ref": "#/components/schemas/TenantConnectorInstance"
            },
            "type": "array"
          },
          "vendorSlug": {
            "description": "Vendor slug",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "vendorSlug",
          "connectorInstances"
        ],
        "type": "object"
      },
      "ConnectorLifecycleStatusEnum": {
        "description": "ConnectorLifecycleStatusEnum is the release-maturity label on a connector\ndefinition (Connector.releaseStatus). Values Draft through Verified are an\nordered progression. Write paths preserve maturity unless given an explicit\nhigher or lower target. ParableReleaseStageEnum controls what customers see.\n\nMaturity progression and required proof:\n\nDraft        -\u003e identity proof\nConfigured   -\u003e catalog proof\nAuthorized   -\u003e credential-intake proof (product label: Authorizable)\nExecutable   -\u003e config-execution proof\nLanding      -\u003e orchestration proof\nMaterialized -\u003e query proof\nVerified     -\u003e release proof",
        "enum": [
          "draft",
          "configured",
          "authorized",
          "executable",
          "landing",
          "materialized",
          "modeled",
          "verified",
          "deprecated"
        ],
        "type": "string"
      },
      "ConnectorOAuthCompleteInput": {
        "properties": {
          "code": {
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "state",
          "code"
        ],
        "type": "object"
      },
      "ConnectorOAuthCompleteResult": {
        "properties": {
          "success": {
            "type": "boolean"
          }
        },
        "required": [
          "success"
        ],
        "type": "object"
      },
      "ConnectorOAuthStartInput": {
        "properties": {
          "clientId": {
            "type": "string"
          },
          "clientSecret": {
            "type": "string"
          },
          "redirectUri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "tenantConnectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantConnectorId",
          "clientId",
          "clientSecret",
          "redirectUri"
        ],
        "type": "object"
      },
      "ConnectorOAuthStartResult": {
        "properties": {
          "authorizeUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "required": [
          "authorizeUrl"
        ],
        "type": "object"
      },
      "ConnectorPermissionModelEnum": {
        "description": "How a connector gates access to a tap's data, which determines how the\nplatform expresses each tap's required access and reconciles it against what\nthe customer's credential actually grants. This is the permission *vocabulary*,\nnot an exemption: only `none` opts a connector out of per-tap requirements.",
        "enum": [
          "object_acl",
          "oauth_scope",
          "none"
        ],
        "type": "string"
      },
      "ConnectorPriorityEnum": {
        "description": "Priority level assigned to a vendor grouping for a specific tenant.",
        "enum": [
          "required",
          "suggested"
        ],
        "type": "string"
      },
      "ConnectorRateLimits": {
        "description": "Connector Rate Limits\nRate limiting and retry configuration for connectors and individual taps.\nCan be set at the connector level (global) and overridden per-tap.\nRate limit configuration for a connector or tap.",
        "properties": {
          "admissionKind": {
            "$ref": "#/components/schemas/RequestAdmissionKindEnum",
            "description": "How provider requests are admitted. Absent means fixed: the limits below.\nprovider_budget must be explicit and is the only kind that may carry\nproviderBudgetPolicy."
          },
          "maxConcurrent": {
            "description": "Maximum concurrent requests",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "providerBudgetPolicy": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProviderBudgetPolicy"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "requestsPerSecond": {
            "description": "Maximum requests per second",
            "format": "double",
            "minimum": 0.000001,
            "nullable": true,
            "type": "number"
          },
          "resetHeader": {
            "description": "Response header containing the Unix epoch reset time (e.g. x-rate-limit-reset for Okta). Used as fallback when Retry-After is absent.\nIt times the cooldown only; it does not by itself mark a 403 as a throttle.",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          },
          "retry": {
            "description": "Retry behavior configuration",
            "oneOf": [
              {
                "$ref": "#/components/schemas/RetryConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "admissionKind"
        ],
        "type": "object"
      },
      "ConnectorRequestStatusEnum": {
        "description": "Connector Request \u0026 Research Enumerations\nEnums for the connector request and research lifecycle (EDR-0013).\nLifecycle status of a connector request (demand signal).\nTracks the request from submission through resolution.",
        "enum": [
          "pending",
          "researching",
          "research_complete",
          "approved",
          "rejected"
        ],
        "type": "string"
      },
      "ConnectorRequestSummary": {
        "description": "Customer-facing view of a connector request.\nOmits sensitive admin/pipeline fields.",
        "properties": {
          "connectorName": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "notes": {
            "description": "Markdown text",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "resolvedGroupingId": {
            "description": "Resolved vendor grouping, if matched",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resolvedVendorId": {
            "description": "Resolved vendor from the connector catalog, if matched",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resultConnectorId": {
            "description": "Resulting connector ID after approval",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ConnectorRequestStatusEnum"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "updatedAt",
          "connectorName",
          "status"
        ],
        "type": "object"
      },
      "ConnectorRequestsPaginatedResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ConnectorRequestSummary"
            },
            "type": "array"
          },
          "limit": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "offset": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "total": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "ConnectorSyncDetail": {
        "description": "Sync error detail for a connector instance.\nReturned by tenantConnectorSyncDetail when connectionStatus is SYNC_FAILED or SYNC_PARTIAL_SUCCESS.",
        "properties": {
          "errorCode": {
            "description": "Error code from the most recent failed sync job.\nFree-form string; will be replaced with a typed enum once sync error codes are standardised.",
            "nullable": true,
            "type": "string"
          },
          "errorMessage": {
            "description": "Error message from the most recent failed sync job.",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "ConnectorTap": {
        "description": "Definition of a data extraction tap for a connector.\nA tap represents a single endpoint/entity type that can be extracted.",
        "properties": {
          "access": {
            "description": "The access facts this tap carries for source permissions (EDR-0095).\nNull = none.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapAccessConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "customFields": {
            "description": "Capture config for dynamic/custom fields (PARABLE-734). Null = capture off.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapCustomFieldsConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "dataKind": {
            "description": "Materialization class for this tap's records on the promote path.\nNull = undeclared; the promote path applies documented defaults.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapDataKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "deduplicateAcrossLoads": {
            "description": "Whether records with the same declared transform key are deduplicated\nacross separate loads.",
            "type": "boolean"
          },
          "deletionSemantics": {
            "description": "How deletions are detectable in this tap's source. Null = undeclared.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapDeletionSemanticsEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "description": {
            "description": "Human-readable description of what this tap extracts",
            "nullable": true,
            "type": "string"
          },
          "docs": {
            "description": "Reader-facing tap identity. Nullable for legacy rows.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapDocumentation"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "enabledByDefault": {
            "description": "Whether this tap is enabled by default for new connections",
            "type": "boolean"
          },
          "enabledSince": {
            "description": "Start of the current uninterrupted default-enabled period. Null when\ndisabled or when a legacy enabled period predates tracking.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "errorBodyRules": {
            "description": "Rules that reclassify HTTP errors from the response body (retry vs skip).",
            "items": {
              "$ref": "#/components/schemas/ErrorBodyRule"
            },
            "nullable": true,
            "type": "array"
          },
          "extractionHook": {
            "description": "Hook executed after extracting response records",
            "nullable": true,
            "type": "string"
          },
          "icon": {
            "description": "Semantic Font Awesome glyph name. Nullable for legacy rows.",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "identityDirectory": {
            "description": "Marks principal/account-directory taps (e.g. Slack users, Okta users).\nDirectory taps are unioned into the account set downstream.",
            "type": "boolean"
          },
          "name": {
            "description": "Unique name for this tap (e.g., 'repos', 'issues', 'users')",
            "maxLength": 80,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9_]*$",
            "type": "string"
          },
          "objectName": {
            "description": "API object name for field discovery (e.g., 'User', 'Account' for Salesforce SOQL objects)",
            "nullable": true,
            "type": "string"
          },
          "parentContextFields": {
            "description": "Mappings to inject parent record values into tap output records.\nUsed on root taps fed by config fan-out when no traversal edge supplies\nparent context (e.g. team_id from synthetic parent records).",
            "items": {
              "$ref": "#/components/schemas/ParentContextFieldMapping"
            },
            "nullable": true,
            "type": "array"
          },
          "perParentAuth": {
            "description": "Per-parent authentication or request headers. When unset the connector's\ndefault auth is used without parent-derived headers.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapPerParentAuth"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "purpose": {
            "description": "Free-form Markdown explaining why customers use this data stream.",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "qualityConfig": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapQualityConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "rateLimitOverride": {
            "description": "Rate limit overrides for this specific tap",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorRateLimits"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "rateLimits": {
            "description": "Per-tap rate limits (e.g. maxConcurrent) merged over connector defaults.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorRateLimits"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "requestHook": {
            "description": "Hook executed before making transport requests",
            "nullable": true,
            "type": "string"
          },
          "requiredAccess": {
            "description": "Read-only. The access this tap needs, derived from the connector's\npermissionModel and this tap's sync.scopes or objectName. Null when the\ntap lacks a required field or its connector has multiple auth strategies.\nStrategy-specific declarations are not yet supported.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapRequiredAccess"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "responseExtraction": {
            "$ref": "#/components/schemas/ResponseExtractionConfig",
            "description": "How to extract records from API responses"
          },
          "retentionPolicy": {
            "description": "Source API data retention policy. Null if the source has no retention limit.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TapRetentionPolicy"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "schema": {
            "description": "The schema describing the shape of the data this tap outputs. Customers\nrender this in the data-catalog UI to enumerate available fields.",
            "type": "object"
          },
          "sync": {
            "$ref": "#/components/schemas/TapSyncConfig",
            "description": "Sync strategy and incremental parameters"
          },
          "tombstoneMarkerColumn": {
            "description": "Root schema field whose truthy value marks an explicit tombstone record.\nRequired when deletionSemantics is tombstone.",
            "nullable": true,
            "type": "string"
          },
          "transportOptions": {
            "description": "Prioritized transport options for this tap",
            "items": {
              "$ref": "#/components/schemas/TapTransportOption"
            },
            "type": "array"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "name",
          "transportOptions",
          "responseExtraction",
          "sync",
          "enabledByDefault",
          "schema",
          "deduplicateAcrossLoads",
          "identityDirectory"
        ],
        "type": "object"
      },
      "ConnectorTraversalConfig": {
        "description": "Connector Traversal Configuration\nFormalizes the implicit DAG (parentTap/parentKeyField) into an explicit\ntraversal graph with typed edges. This makes the data extraction order\nvisible at the schema level and enables validation (cycle detection,\norphan detection, fan-out limits).\nTraversal configuration defining the DAG of tap relationships.\nThe ingestion engine uses this to determine extraction order and\nparent-child data flow.",
        "properties": {
          "configFanouts": {
            "description": "Maps a multi-value ingestion config field to a URL template variable for\nroot taps. The runtime fans out one API request per value.",
            "items": {
              "$ref": "#/components/schemas/ConnectorConfigFanout"
            },
            "nullable": true,
            "type": "array"
          },
          "edges": {
            "description": "Directed edges defining parent-child relationships between taps.\nEach edge specifies how parent records are used to construct child requests.",
            "items": {
              "$ref": "#/components/schemas/ConnectorEdge"
            },
            "nullable": true,
            "type": "array"
          },
          "rootTaps": {
            "description": "Taps with no parent — the entry points for data extraction.\nThese are synced first; their records feed into child taps via edges.",
            "items": {
              "description": "A machine identifier for a data tap (lowercase letter, then lowercase alphanumeric or underscores)",
              "maxLength": 80,
              "minLength": 1,
              "pattern": "^[a-z][a-z0-9_]*$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "rootTaps"
        ],
        "type": "object"
      },
      "ConnectorVisibilityModelEnum": {
        "description": "How a source system decides which of its own users may see a record\n(EDR-0095). This describes the source's rules for its users. It is separate\nfrom ConnectorPermissionModelEnum, which describes what Parable's credential\nneeds in order to read a tap.",
        "enum": [
          "record_acl",
          "container_acl",
          "source_users",
          "unrestricted",
          "not_modeled"
        ],
        "type": "string"
      },
      "ConsultProblemPingPurpose": {
        "description": "One question inside a Ping. A Ping carries as many questions as the asker\nneeds; nothing here caps the bundle. name is the short column label, question\nis the prompt as asked, and a person may always answer in their own words\ninstead of choosing an offered Possibility.",
        "properties": {
          "audience": {
            "$ref": "#/components/schemas/ProblemPingAudienceEnum"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "modality": {
            "$ref": "#/components/schemas/ProblemPingQuestionModalityEnum"
          },
          "name": {
            "type": "string"
          },
          "possibilityIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "question": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "audience",
          "question",
          "modality",
          "possibilityIds"
        ],
        "type": "object"
      },
      "ConsultProblemPingPurposeInput": {
        "description": "One question. name is its short column label and question is the prompt. The\nstructural bounds below exist to refuse absurd payloads, not to shape how many\nquestions an asker may bundle; nothing surfaced to an asker names a limit.",
        "properties": {
          "audience": {
            "$ref": "#/components/schemas/ProblemPingAudienceEnum"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "modality": {
            "$ref": "#/components/schemas/ProblemPingQuestionModalityEnum"
          },
          "name": {
            "type": "string"
          },
          "possibilities": {
            "items": {
              "$ref": "#/components/schemas/NewPingPossibilityInput"
            },
            "maxItems": 200,
            "minItems": 0,
            "type": "array"
          },
          "question": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "audience",
          "name",
          "handle",
          "question",
          "modality",
          "possibilities"
        ],
        "type": "object"
      },
      "CreateAgentSkillInput": {
        "properties": {
          "content": {
            "description": "Markdown text",
            "maxLength": 65536,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "description": {
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "displayTitle": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "files": {
            "items": {
              "$ref": "#/components/schemas/AgentSkillFile"
            },
            "maxItems": 400,
            "minItems": 0,
            "type": "array"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "Portable Agent Skills directory and frontmatter name",
            "maxLength": 64,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "displayTitle",
          "name",
          "icon",
          "description",
          "content",
          "files",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "CreateConnectorRequestInput": {
        "description": "Customer-facing connector request types (admin/pipeline fields omitted).",
        "properties": {
          "connectorName": {
            "description": "Connector name as requested by the customer (free-form)",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "notes": {
            "description": "Optional notes or context about the request",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "connectorName"
        ],
        "type": "object"
      },
      "CreateIndependentParableInput": {
        "properties": {
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "identityIsPlaceholder": {
            "description": "True when name and handle are the random placeholder the web app draws.\nSummarize then starts on, and Ponder names the Parable from its first\nMessage. Omitted means a chosen name, and Summarize starts off.",
            "nullable": true,
            "type": "boolean"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "handle",
          "name",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "CreateIndependentParableResult": {
        "properties": {
          "primary": {
            "$ref": "#/components/schemas/ParablePrimaryView"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          }
        },
        "required": [
          "receipt",
          "primary"
        ],
        "type": "object"
      },
      "CreateMilestoneDelegationInput": {
        "description": "Input for creating a data milestone request",
        "properties": {
          "milestoneLineItems": {
            "description": "Per-milestone line items carrying the viewer's connector/category selections.\nInclude an entry for each optional milestone the viewer wants to add.\nRequired milestones are always included by the server -- include them here only if\nthe viewer made explicit connector selections for them.",
            "items": {
              "$ref": "#/components/schemas/MilestoneDelegationLineItemInput"
            },
            "type": "array"
          },
          "parableDefinitionId": {
            "description": "ID of the ParableDefinition this request is for",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "recipients": {
            "description": "Integrators to send the request to. Must have at least one entry.\nExisting members get a direct deep-link per connector; non-members receive an invitation.",
            "items": {
              "$ref": "#/components/schemas/MilestoneRequestRecipientInput"
            },
            "type": "array"
          }
        },
        "required": [
          "parableDefinitionId",
          "milestoneLineItems",
          "recipients"
        ],
        "type": "object"
      },
      "CreateParablePossibilityInput": {
        "properties": {
          "arguments": {
            "items": {
              "$ref": "#/components/schemas/NewParablePossibilityArgumentInput"
            },
            "maxItems": 100,
            "type": "array"
          },
          "consultPurposeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "responsibilities": {
            "items": {
              "$ref": "#/components/schemas/ParableActorAssignment"
            },
            "maxItems": 100,
            "type": "array"
          },
          "summary": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "expectedProblemRevision",
          "consultPurposeId",
          "name",
          "handle",
          "summary",
          "arguments",
          "responsibilities",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "CreateParablePossibilityResult": {
        "properties": {
          "possibility": {
            "$ref": "#/components/schemas/ParablePossibility"
          },
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "possibility",
          "problemRevision"
        ],
        "type": "object"
      },
      "CreateParableProblemInput": {
        "description": "Create a durable Workspace-owned Problem with zero or more exact authorized\ncontext links. Problems form one tree per Parable (PARABLE-6851). The\nParable's root Problem is made with the Parable. Every other Problem sits\nunder a parent in the same Parable.",
        "properties": {
          "description": {
            "description": "One or two sentences on the outcome the Problem is for.",
            "maxLength": 2000,
            "minLength": 1,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "The icon that marks the Problem, and its Changes, everywhere it shows.",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "initialContexts": {
            "items": {
              "$ref": "#/components/schemas/NewParableProblemContextInput"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "lifecycle": {
            "$ref": "#/components/schemas/ParableProblemLifecycleEnum"
          },
          "name": {
            "description": "A name a teammate can recognize later.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "parentProblemId": {
            "description": "The Problem the new one sits under, in the same Parable. Null is accepted\nonly inside a Ponder turn, where the new Problem goes under the turn's own\nProblem. Anywhere else a missing parent is refused: only a Parable makes\nits root Problem.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pieceKind": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePieceKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "prominence": {
            "$ref": "#/components/schemas/ParableProblemProminenceEnum"
          },
          "proposalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rootRefId": {
            "description": "Compatibility initial root; new clients use initialContexts.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "stage": {
            "$ref": "#/components/schemas/ParableProblemStageEnum"
          }
        },
        "required": [
          "initialContexts",
          "name",
          "handle",
          "description",
          "icon",
          "stage",
          "lifecycle",
          "prominence",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "CreateParableProblemPingInput": {
        "properties": {
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "messageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "purposes": {
            "items": {
              "$ref": "#/components/schemas/ProblemPingPurposeInput"
            },
            "maxItems": 200,
            "minItems": 1,
            "type": "array"
          },
          "recipientSummary": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "targets": {
            "items": {
              "$ref": "#/components/schemas/CreateParableProblemPingTargetInput"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "expectedProblemRevision",
          "recipientSummary",
          "purposes",
          "targets",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "CreateParableProblemPingTargetInput": {
        "properties": {
          "targetActor": {
            "$ref": "#/components/schemas/ParableActorRef",
            "description": "V1 accepts only person actors and verifies active target membership without disclosing failures."
          },
          "targetWorkspaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "targetWorkspaceId",
          "targetActor"
        ],
        "type": "object"
      },
      "CreateParableProblemProofInput": {
        "properties": {
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "proof": {
            "$ref": "#/components/schemas/NewParableProblemProofInput"
          }
        },
        "required": [
          "expectedProblemRevision",
          "proof",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "CreateParableProblemProofResult": {
        "properties": {
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "proof": {
            "$ref": "#/components/schemas/ParableProblemProof"
          }
        },
        "required": [
          "proof",
          "problemRevision"
        ],
        "type": "object"
      },
      "CreateParableProposalInput": {
        "properties": {
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "problemId": {
            "description": "The Problem the new set of Changes answers (PARABLE-6851). Each Problem\nhas at most one set, and a Parable's root Problem has none. Inside a\nPonder turn, null means the turn's own Problem. Elsewhere, null opens a\nset that no Problem holds, as a Pull or a Versioned setting's save does.\nA Problem the caller cannot read is refused as not found (PA-AU-001).",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "idempotencyKey"
        ],
        "type": "object"
      },
      "CreateParableRealtimeTicketInput": {
        "properties": {
          "origin": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "protocol": {
            "$ref": "#/components/schemas/ParableRealtimeProtocolEnum"
          }
        },
        "required": [
          "origin",
          "protocol"
        ],
        "type": "object"
      },
      "CreateTenantConnectorTapInput": {
        "description": "Create a per-workspace override of a platform tap. Required input is the\nsource instance and the platform data pull. Everything else is optional\nand, when omitted, is copied from the platform ConnectorTap\n(PARABLE-2165). Artifact-derived taps use `publishArtifact`.",
        "properties": {
          "connectorTapId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tap": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TenantConnectorTapInput"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "tenantConnectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantConnectorId",
          "connectorTapId"
        ],
        "type": "object"
      },
      "CreateWorkspaceApiTokenInput": {
        "description": "Input for creating a personal access token in the selected Workspace.",
        "properties": {
          "audience": {
            "$ref": "#/components/schemas/ApiTokenAudienceEnum",
            "description": "Where the token works: flight_sql or mcp. A member cannot create an all\ntoken; that value is refused."
          },
          "expiresInDays": {
            "description": "Days until the token stops working, from 1 to 365. Null means 90.",
            "format": "int64",
            "maximum": 365,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "name": {
            "description": "A label that says where the token is used.",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "name",
          "audience"
        ],
        "type": "object"
      },
      "CreateWorkspaceApiTokenResult": {
        "description": "The created token. `token` is its value, returned this once and never again.",
        "properties": {
          "apiToken": {
            "$ref": "#/components/schemas/WorkspaceApiToken"
          },
          "token": {
            "description": "The token's value, pat_ followed by 43 characters. Store it in a secret\nmanager; Parable keeps only its SHA-256 hash.",
            "type": "string"
          }
        },
        "required": [
          "apiToken",
          "token"
        ],
        "type": "object"
      },
      "CreateWorkspaceInput": {
        "properties": {
          "inviteCode": {
            "description": "Invite code to redeem, as entered (hyphens, spaces, and case are\nignored). Required while signup is invite-only, unless the caller is\nParable staff.",
            "nullable": true,
            "type": "string"
          },
          "organizationName": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "organizationSize": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/OrganizationSize"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "organizationWebsite": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "returnTo": {
            "nullable": true,
            "type": "string"
          },
          "workspaceSlug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "organizationName"
        ],
        "type": "object"
      },
      "CredentialProbeWorkflow": {
        "description": "The credential check an auth strategy declares instead of the generic probe\n(PARABLE-4273, PARABLE-4274). Operations run in order: the first one whose\noutcome is not success decides the verdict, and the credential is valid\nwhen every operation succeeds. success maps to VALID; auth_rejected,\npermission_denied and config_invalid to INVALID with that reason; retry and\nupstream_failure keep the stored status; expected_empty, and a response no\nrule matches, leave the credential unvalidated.",
        "properties": {
          "maxRequests": {
            "description": "Most HTTP requests the workflow may send, retries included. Defaults to 6.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "operations": {
            "description": "The operations to run, in order.",
            "items": {
              "$ref": "#/components/schemas/ProviderOperation"
            },
            "type": "array"
          },
          "signedTokens": {
            "description": "Tokens the check signs from the credential (PARABLE-5254). At most 4.",
            "items": {
              "$ref": "#/components/schemas/ProviderSignedToken"
            },
            "nullable": true,
            "type": "array"
          },
          "timeoutSeconds": {
            "description": "Wall-clock budget for the whole workflow. Defaults to 30. A workflow that\nruns out of time keeps the stored credential status.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "writebacks": {
            "description": "Extracted values written to the connection's ingestion config when every\noperation succeeds. A value that fails its target field's type, or that\nmatches a credential or secret value, is withheld.",
            "items": {
              "$ref": "#/components/schemas/CredentialProbeWriteback"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "operations"
        ],
        "type": "object"
      },
      "CredentialProbeWriteback": {
        "description": "An extracted value a successful workflow stores in the connection's\ningestion config (PARABLE-4929), the way a Tableau sign-in records the site\nid. Only an extract declared `secret: false`, of type string, may be\nwritten, and only to a declared, non-URL, string ingestion field.",
        "properties": {
          "extract": {
            "description": "The extract's name within that operation.",
            "type": "string"
          },
          "operation": {
            "description": "The id of the operation that extracts the value.",
            "type": "string"
          },
          "target": {
            "description": "The top-level ingestion config field the value is written to.",
            "type": "string"
          }
        },
        "required": [
          "operation",
          "extract",
          "target"
        ],
        "type": "object"
      },
      "CredentialStatus": {
        "description": "Credential Types for Tenant Connector Configuration\nThese types define how credentials are stored and referenced for connector authentication.\nCredentials are stored securely in GCP Secret Manager - only metadata/references are in the DB.\nThese types are created when customers configure connectors through the UI,\nas part of the tenant connector setup workflow.\n============================================================================\nCredential Enums\n============================================================================\nStatus of stored credentials.",
        "enum": [
          "valid",
          "expired",
          "invalid",
          "pending",
          "unvalidated"
        ],
        "type": "string"
      },
      "CursorPaginationConfig": {
        "description": "Configuration for cursor-based pagination.",
        "properties": {
          "cursorBodyPath": {
            "description": "Dot-notation path inside the POST request body where the cursor must be\ninjected for the next page (e.g., 'cursor', 'variables.after').\nWhen set, the cursor is written into the body instead of the query string.\nRequired for APIs that paginate POST endpoints with a body cursor (e.g.,\nGong /v2/calls/extensive).",
            "nullable": true,
            "type": "string"
          },
          "cursorIsFullUrl": {
            "description": "When true, the cursor value is an absolute URL (e.g., OData @odata.nextLink)",
            "nullable": true,
            "type": "boolean"
          },
          "cursorParam": {
            "description": "Query parameter name for cursor (default: 'cursor')",
            "nullable": true,
            "type": "string"
          },
          "cursorPath": {
            "description": "JMESPath to extract next cursor from response",
            "type": "string"
          },
          "hasMorePath": {
            "description": "JMESPath to check if more pages exist",
            "nullable": true,
            "type": "string"
          },
          "nextCursorPath": {
            "description": "JMESPath to extract the next cursor from the nextQuery response.",
            "nullable": true,
            "type": "string"
          },
          "nextDataPath": {
            "description": "JMESPath to extract records from the nextQuery response.",
            "nullable": true,
            "type": "string"
          },
          "nextEndpoint": {
            "description": "Endpoint for continuation requests, which send only the cursor body.",
            "nullable": true,
            "type": "string"
          },
          "nextQuery": {
            "description": "GraphQL query used to fetch subsequent pages when the API requires a\ndifferent query to continue a cursor. Example: monday.com fetches the first\npage via boards { items_page }, then continues with next_items_page(cursor).",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "cursorPath"
        ],
        "type": "object"
      },
      "CustomRegistrationRevisionRef": {
        "description": "A catalog-wide Custom revision plus the exact registration entry it identifies.",
        "properties": {
          "artifactDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "contentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableRevisionRefKindEnum"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "registrationKey": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "registrationRevisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revisionNumber": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "parableId",
          "registrationRevisionId",
          "registrationKey",
          "revisionNumber",
          "contentHash",
          "artifactDigest"
        ],
        "type": "object"
      },
      "DecideParableProblemRunApprovalInput": {
        "properties": {
          "decision": {
            "$ref": "#/components/schemas/ProblemRunDecisionEnum"
          },
          "expectedApprovalRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedApprovalRevision",
          "idempotencyKey",
          "decision"
        ],
        "type": "object"
      },
      "DeclineTenantProviderPoolRebuildInput": {
        "description": "Decline one of this Workspace's Provider Pool rebuilds (PARABLE-5348).",
        "properties": {
          "reason": {
            "maxLength": 2000,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "DeleteArtifactFolderResult": {
        "description": "Result of soft-deleting a virtual folder. `deletedCount` is the number of\nartifacts whose path was at or below the deleted folder.",
        "properties": {
          "deletedCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "deletedCount"
        ],
        "type": "object"
      },
      "DeployParableRolloutInput": {
        "description": "Input for deployAdminParableRollout (PARABLE-1815 / PARABLE-1469 \"Reach\").\n# Why this is not a mode of publish\nPublish and Deploy are two axes and PARABLE-1469 separates them:\nLifecycle  publish  moves a Proposal forward INSIDE one Deployment\nReach      deploy   changes WHICH organizations hold the Parable\nUntil this route the two were fused in the API. `publishAdminParableProposal`\nis the only caller that ever named the Deploy contract row, so the only way\nto change a Parable's audience was to seal a new Commit -- which is a\nlifecycle act, performed on the timeline, with an author and a message,\noffered to every Workspace already holding the Parable as something new to\npull. Widening an audience is none of those things and should cost none of\nthem.\nThis route mints a Rollout for a Commit that is ALREADY published. It seals\nnothing, advances no Proposal, writes no Commit and moves no open set. The\nParable's timeline is identical before and after; only its audience differs.\n# Authorization\nDeploy is the one contract row whose `requires` is a CONJUNCTION:\n`admin.parables.manage` AND RESPONSIBLE on the SOURCE Deployment. The\npermission half is what a Workspace can never hold, which is what makes this\nthe one capability that is admin-only by construction rather than by policy.\nThe seat half is what stops a leaf-holder deploying a Parable they hold no\nRACI on and therefore cannot see.\nResponsible rather than Accountable, matching Revoke: widening an audience is\nrecoverable, and Revoke is how it is taken back.\nThe admin button reads \"Publish \u0026 Deploy\" because an author usually wants\nboth. That is a fact about the button and not about the API; keeping the two\nroutes separate is what lets them be permissioned differently and what keeps\n\"a Workspace publishing to nobody\" distinguishable from \"an admin publishing\nto forty organizations\" in the ledger.",
        "properties": {
          "expectedCommitId": {
            "description": "The Commit the caller believed the source line was serving. Without it a\ndeploy racing a publish would hand a brand new Commit to an audience whose\noperator was looking at the previous one when they chose it.\nThere is no `expectedRolloutId` counterpart. Revoke needs one because it\nnarrows a specific Rollout's audience; this states an end state, and two\nconcurrent deploys naming the same Commit and the same targets agree.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "selectedWorkspaceIds": {
            "description": "Nullable for the same reason the publish input's copy is: `required` on a\nlist means non-empty, and empty is the only legal value for `parable` and\n`all`.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "targetMode": {
            "$ref": "#/components/schemas/ParableWorkspaceTargetModeEnum",
            "description": "Which organizations. `parable` and `all` take no list; only `some` names\nWorkspaces, and `resolveDeploymentTargets` refuses the other combinations."
          }
        },
        "required": [
          "targetMode",
          "expectedCommitId",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "DeployParableRolloutResult": {
        "description": "Result of deployAdminParableRollout (PARABLE-1815).\n`addedTenantIds` is stated rather than left to a diff of two Rollouts, for the\nsame reason RevokeParableDeploymentResult states `revokedTenantIds`: \"who\ngained access\" should be a fact a reader can read rather than one they have to\nreconstruct from two audience snapshots.",
        "properties": {
          "addedTenantIds": {
            "description": "Workspaces that did not hold this Parable before this Rollout.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "commitId": {
            "description": "The Commit that was deployed -- always the one the caller named in\n`expectedCommitId`, echoed so a log line carries it without a second read.\nThis route never seals a Commit, so this is never a new id.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "deliveriesCreated": {
            "description": "Deliveries actually written. Lower than the audience size whenever a\nrecipient already runs this Commit: those get an audience-only row, because\noffering someone content they pulled last week is noise.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptView"
          },
          "rolloutId": {
            "description": "The NEW Rollout carrying the stated audience.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "receipt",
          "rolloutId",
          "commitId",
          "addedTenantIds",
          "deliveriesCreated"
        ],
        "type": "object"
      },
      "DescribePoolTableInput": {
        "properties": {
          "tableRef": {
            "description": "The table's name as a FROM clause takes it, such as\n`providers.jiracloud.issues`. Search results return it as `tableRef`.",
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "tableRef"
        ],
        "type": "object"
      },
      "DesktopAuthChallengeMethod": {
        "enum": [
          "S256"
        ],
        "type": "string"
      },
      "DesktopAuthClient": {
        "description": "Explicit clients for proof-bound native sign-in. Both Ponder and Pulse bind\neach one-time code to the app that asked, with an S256 proof.",
        "enum": [
          "ponder",
          "pulse"
        ],
        "type": "string"
      },
      "DesktopAuthTokenConsumeInput": {
        "additionalProperties": false,
        "properties": {
          "client": {
            "$ref": "#/components/schemas/DesktopAuthClient"
          },
          "codeVerifier": {
            "maxLength": 128,
            "minLength": 43,
            "pattern": "^[A-Za-z0-9._~-]{43,128}$",
            "type": "string"
          }
        },
        "required": [
          "client",
          "codeVerifier"
        ],
        "type": "object"
      },
      "DesktopAuthTokenCreateInput": {
        "additionalProperties": false,
        "properties": {
          "client": {
            "$ref": "#/components/schemas/DesktopAuthClient"
          },
          "codeChallenge": {
            "maxLength": 43,
            "minLength": 43,
            "pattern": "^[A-Za-z0-9_-]{43}$",
            "type": "string"
          },
          "codeChallengeMethod": {
            "$ref": "#/components/schemas/DesktopAuthChallengeMethod"
          }
        },
        "required": [
          "client",
          "codeChallenge",
          "codeChallengeMethod"
        ],
        "type": "object"
      },
      "DesktopAuthTokenPayload": {
        "description": "Result of createDesktopAuthTokenForClient: a single-use, short-TTL opaque\ncode bound to the client and S256 challenge that asked for it. Only that\nclient, with its verifier, can exchange it. The code is NOT a session JWT\nand is worthless after one exchange or after expiresAt.",
        "properties": {
          "connectBundleAvailable": {
            "description": "Whether consuming this token will also deliver a device connect bundle\n(enrollment secret). Always false for Ponder. For Pulse, false when the\nuser is not an active member of the Workspace, or the Workspace has no\nsingle desktop agent connector with its activity tap on: the device signs\nin but does not enroll. pulseDeviceEnrollment gives the reason.",
            "type": "boolean"
          },
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "token": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "token",
          "expiresAt",
          "connectBundleAvailable"
        ],
        "type": "object"
      },
      "DesktopConnectBundle": {
        "description": "Enrollment material handed to the Pulse desktop daemon alongside its session\nby consumeDesktopAuthTokenForClient, for a Pulse code only. Delivered\nserver-to-server (never on the parable-pulse:// URL). The daemon exchanges the enrollment secret for a\ndeviceRef + ingest token via enrollDevice.",
        "properties": {
          "enrollmentSecret": {
            "description": "One-time device enrollment secret (single-use, expires).",
            "type": "string"
          },
          "tenantConnectorId": {
            "description": "The desktop agent TenantConnector the secret enrolls into.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantSlug": {
            "description": "The Workspace slug, sent as the X-Tenant header on tenant-scoped calls\nthe daemon makes (e.g. fetching the content-encryption public key).",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "enrollmentSecret",
          "tenantConnectorId",
          "tenantSlug"
        ],
        "type": "object"
      },
      "DeviceEnrollmentSecretInfo": {
        "description": "A single-use device enrollment secret. Projection of web-db\nDeviceEnrollmentSecret; the plaintext is returned exactly once at mint via\nMintDeviceEnrollmentSecretResult.secret; afterwards the prefix is the only\nuser-visible identifier.",
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "prefix": {
            "description": "First characters of the plaintext secret, for list identification.",
            "type": "string"
          },
          "revokedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "tenantConnectorId": {
            "description": "Flattened Relation\u003cTenantConnector\u003e for the wire.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "usedAt": {
            "description": "Set when a device enrolled with this secret (single-use burn).",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "tenantConnectorId",
          "prefix",
          "expiresAt"
        ],
        "type": "object"
      },
      "DeviceInfo": {
        "description": "An enrolled desktop agent device belonging to the tenant. Projection of\nweb-db DeviceRecord; the device public key is not returned (fleet surfaces\ndo not need it and the collector reads it straight from web-db).",
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "deviceKeyKind": {
            "description": "Where the device keeps its current key's private half, as the device\nreported it (PARABLE-7168): hardware (the Secure Enclave) or software.\nNull when the device did not say (Pulse versions before PARABLE-7168).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/DeviceKeyKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "deviceRef": {
            "description": "Stable device identity presented on every pushed batch.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "displayHint": {
            "description": "Display hint captured at enrollment (e.g. user's UPN or device name).",
            "nullable": true,
            "type": "string"
          },
          "enrolledAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "enrolledUserEmail": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "enrolledUserId": {
            "description": "The person the device enrolled as, flattened from the row's\nenrolledUser relation and joined from web-db User (PARABLE-7160). All\nthree are null for admin/MDM enrollments, which bind no person.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "enrolledUserName": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lastSeenAt": {
            "description": "Last successful batch push. Best-effort, null = never pushed. No service\nwrites the column yet (checked 2026-10-19, PARABLE-7160), so it is always\nnull and the web app's Macs list does not show it.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "revokedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/DeviceRecordStatusEnum"
          },
          "tenantConnectorId": {
            "description": "Flattened Relation\u003cTenantConnector\u003e for the wire.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "updatedAt",
          "tenantConnectorId",
          "deviceRef",
          "status",
          "enrolledAt"
        ],
        "type": "object"
      },
      "DeviceKeyKindEnum": {
        "description": "Where an enrolled device keeps the private half of its device key\n(PARABLE-7168). The device reports it at enrollment and at each re-key.\nIt is the device's own report: web-api cannot prove it.",
        "enum": [
          "hardware",
          "software"
        ],
        "type": "string"
      },
      "DeviceRecordStatusEnum": {
        "description": "Lifecycle of an enrolled device record (Pulse desktop agent). Devices are\nnever hard-deleted while enrolled history matters; revocation flips status\nand the collector rejects the device within its cache TTL.",
        "enum": [
          "active",
          "revoked"
        ],
        "type": "string"
      },
      "DeviceRoutingTokenResult": {
        "description": "The current shared routing ingest token of the device's activity tap\n(PARABLE-7161). Rotation moves the tap to a new token and keeps the old\none only for a grace window, so an enrolled device asks for this value\non a schedule and when the collector refuses its token. The same answer\ncarries the Workspace's current Pulse capture policy (PARABLE-7170).",
        "properties": {
          "capturePolicy": {
            "description": "The apps Pulse skips on this Workspace's Macs (PARABLE-7170). web-api\nalways sets it. A device reads a missing value as \"no change\" and keeps\nthe list it has, so a Mac that is newer than the server keeps working.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PulseCapturePolicy"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "ingestEndpointUrl": {
            "description": "Full collector batches endpoint URL embedding the ingest token.",
            "type": "string"
          },
          "ingestToken": {
            "description": "Plaintext of the tap's permanent live routing token: the same value\nevery device on the tap receives from enrollDevice. Persist in the\ndevice keychain, nowhere else.",
            "type": "string"
          },
          "refreshAfterSeconds": {
            "description": "Ask again after this many seconds. The server derives it from the\nrotation grace window, so a device that follows it moves to a rotated\ntoken before the old token expires.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "ingestToken",
          "ingestEndpointUrl",
          "refreshAfterSeconds"
        ],
        "type": "object"
      },
      "DirectModelExecutionTarget": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ModelExecutionTargetKindEnum"
          },
          "modelReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "routeBindingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "modelReleaseId",
          "routeBindingId"
        ],
        "type": "object"
      },
      "DirectModelPipelineExecutionTarget": {
        "description": "Atomically resolved multi-model target, initially used by Speak for Dictation and Voice.",
        "properties": {
          "components": {
            "items": {
              "$ref": "#/components/schemas/ModelExecutionComponent"
            },
            "type": "array"
          },
          "kind": {
            "$ref": "#/components/schemas/ModelExecutionTargetKindEnum"
          }
        },
        "required": [
          "kind",
          "components"
        ],
        "type": "object"
      },
      "DiscoverParableProblemMessageToolsInput": {
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "nullable": true,
            "type": "string"
          },
          "inspectExpand": {
            "description": "With inspectHandle only: names of shapes the operation's input schema\nabbreviates, to return spelled out (with every shape inside them). Null\nreturns the short schema (PARABLE-6163).",
            "items": {
              "type": "string"
            },
            "maxItems": 64,
            "minItems": 1,
            "nullable": true,
            "type": "array"
          },
          "inspectHandle": {
            "description": "Exact handle whose schema may be returned; requires limit 1, no cursor, and search equal to the handle.",
            "nullable": true,
            "type": "string"
          },
          "limit": {
            "description": "How many operations one page returns, the best matches first; at most 25.",
            "format": "int64",
            "maximum": 25,
            "minimum": 1,
            "type": "integer"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableProblemMessageToolScope"
          },
          "search": {
            "description": "Empty lists every authorized operation.",
            "maxLength": 200,
            "type": "string"
          }
        },
        "required": [
          "scope",
          "search",
          "limit"
        ],
        "type": "object"
      },
      "DiscoverParableProblemMessageToolsResult": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PonderParableAvailableTool"
            },
            "maxItems": 25,
            "minItems": 0,
            "type": "array"
          },
          "nextCursor": {
            "nullable": true,
            "type": "string"
          },
          "registryDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "items",
          "registryDigest"
        ],
        "type": "object"
      },
      "DiscoverParableProblemRunToolsInput": {
        "properties": {
          "cursor": {
            "nullable": true,
            "type": "string"
          },
          "inspectExpand": {
            "description": "With inspectHandle only: names of shapes the operation's input schema\nabbreviates, to return spelled out (with every shape inside them). Null\nreturns the short schema (PARABLE-6163).",
            "items": {
              "type": "string"
            },
            "maxItems": 64,
            "minItems": 1,
            "nullable": true,
            "type": "array"
          },
          "inspectHandle": {
            "description": "Exact handle whose schema may be returned; null keeps search rows lightweight.",
            "nullable": true,
            "type": "string"
          },
          "limit": {
            "description": "How many operations one page returns. web-api returns at most 25, the best\nmatches first, because every result stays in the model's conversation.",
            "format": "int64",
            "maximum": 25,
            "minimum": 1,
            "type": "integer"
          },
          "search": {
            "nullable": true,
            "type": "string"
          },
          "workflowAdapter": {
            "$ref": "#/components/schemas/ParableProblemRunAdapterEnum"
          },
          "workflowRunId": {
            "type": "string"
          }
        },
        "required": [
          "workflowAdapter",
          "workflowRunId",
          "limit"
        ],
        "type": "object"
      },
      "DiscoverParableProblemRunToolsResult": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRunToolDescriptor"
            },
            "maxItems": 25,
            "minItems": 0,
            "type": "array"
          },
          "nextCursor": {
            "nullable": true,
            "type": "string"
          },
          "registryDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "runRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "registryDigest",
          "runRevision"
        ],
        "type": "object"
      },
      "DupeRateRule": {
        "properties": {
          "maxRate": {
            "format": "double",
            "type": "number"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "maxRate"
        ],
        "type": "object"
      },
      "EarlyAccessCatalogItem": {
        "description": "Early Access feature row visible to the current caller.\n- Tenant users see only RELEASED items.\n- Parable staff (admin.earlyaccess.read) see RELEASED and INTERNAL_PREVIEW.\nThe phase is included so the frontend can render the internal-preview banner.",
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "icon": {
            "description": "Stored release icon, normally fa:{pack}:{weight}-{fill}:{name}[@#rrggbb].\nExisting Material names remain readable. Null uses the default flask.",
            "nullable": true,
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "phase": {
            "$ref": "#/components/schemas/TenantFlagPhaseEnum",
            "description": "Lifecycle phase of this release for the current tenant."
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "tier": {
            "$ref": "#/components/schemas/EarlyAccessTierEnum"
          },
          "updatedAt": {
            "description": "When the release was last updated (maps to updatedAt on the DB row).",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "tier",
          "slug",
          "name",
          "phase",
          "updatedAt"
        ],
        "type": "object"
      },
      "EarlyAccessFlagStatus": {
        "description": "Single feature flag status for the current tenant.\nUsed by the frontend for route-guarding early access pages by slug.",
        "properties": {
          "phase": {
            "$ref": "#/components/schemas/TenantFlagPhaseEnum",
            "description": "Lifecycle phase of this release for the current tenant; OFF when not visible."
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "phase"
        ],
        "type": "object"
      },
      "EarlyAccessTierEnum": {
        "enum": [
          "demo",
          "dogfood",
          "labs",
          "previews"
        ],
        "type": "string"
      },
      "EditParablePieceSourceInput": {
        "additionalProperties": false,
        "properties": {
          "document": {
            "$ref": "#/components/schemas/ParablePieceDocumentEnum"
          },
          "edits": {
            "description": "Applied in order, each to the text the edits before it leave.",
            "items": {
              "$ref": "#/components/schemas/ParablePieceSourceEdit"
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          },
          "expectedRefVersion": {
            "description": "The ref version read_piece_problems returned. Other documents may have\nchanged since; this edit is refused only when its own document has\n(`expectedRevision`).",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedRevision": {
            "description": "The document revision read_piece_problems returned.",
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "pieceKey": {
            "description": "The Page, Pane, Plot or Palette to edit: read_piece_problems's pieceKey.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "proposalId": {
            "description": "The open Changes to edit. Inside a Ponder turn they must belong to the\ncurrent Problem or to a Problem under it (PARABLE-6851). Null edits a\nPersonal Parable's own draft, as edit_pieces does. A\nParable in Publishing mode refuses null.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "pieceKey",
          "document",
          "expectedRefVersion",
          "expectedRevision",
          "edits"
        ],
        "type": "object"
      },
      "EditParablePieceSourceResult": {
        "properties": {
          "diagnostics": {
            "$ref": "#/components/schemas/ParablePieceDiagnostics",
            "description": "The Piece after the save, every check included, without document text."
          },
          "revision": {
            "description": "The edited document's new revision.",
            "type": "string"
          }
        },
        "required": [
          "revision",
          "diagnostics"
        ],
        "type": "object"
      },
      "EditParablePiecesInput": {
        "additionalProperties": false,
        "description": "Input for editParablePieces, the one Piece edit tool (PARABLE-6163). It saves\nthe same sparse package the Personal and Publishing saves take, into the\nopen Changes named by proposalId, or onto the Parable itself when\nproposalId is null.",
        "properties": {
          "expectedAggregateRevision": {
            "description": "Personal mode only: the Parable's aggregate revision. Null with proposalId.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "expectedRefVersion": {
            "description": "The revision of the ref being saved: the Changes' source ref, or the Parable's.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "pkg": {
            "$ref": "#/components/schemas/ParableDraftEntityPackage"
          },
          "proposalId": {
            "description": "The open Changes to save into (Publishing mode). Null saves onto the Parable (Personal mode).",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedRefVersion",
          "pkg"
        ],
        "type": "object"
      },
      "EditParablePiecesResult": {
        "description": "What editParablePieces saved: exactly one of the two is set.",
        "properties": {
          "personal": {
            "description": "The save onto the Parable, in Personal mode.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SaveParablePrimaryResult"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "publishing": {
            "description": "The save into open Changes, in Publishing mode.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SaveParableProposalResult"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "type": "object"
      },
      "EffectiveModelCapability": {
        "additionalProperties": false,
        "description": "One capability of a Workspace's effective model policy.",
        "properties": {
          "capability": {
            "$ref": "#/components/schemas/ModelCapability"
          },
          "eligibleProcessors": {
            "description": "The environment's processors for the capability, intersected with the\nstaff ceiling, minus the Workspace's narrowing, in environment order.",
            "items": {
              "$ref": "#/components/schemas/ModelProcessor"
            },
            "type": "array"
          },
          "refusal": {
            "description": "Set when a call that names no model must refuse. Null when resolved is set.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ModelPolicyRefusal"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "resolved": {
            "description": "The model a call that names none uses: the Workspace default when it is\nset and eligible, else the first platform default candidate whose\nprocessor is eligible.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ResolvedModelChoice"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "capability",
          "eligibleProcessors"
        ],
        "type": "object"
      },
      "EffectiveModelPolicy": {
        "additionalProperties": false,
        "description": "A Workspace's effective model policy (PARABLE-4670): what web-api computes\nfrom the environment policy, the Workspace's stored TenantModelPolicy and\nthe global model catalog. Every AI call over the Workspace's data applies\none rule to it (ModelCall, ModelResolution).",
        "properties": {
          "capabilities": {
            "items": {
              "$ref": "#/components/schemas/EffectiveModelCapability"
            },
            "type": "array"
          },
          "digest": {
            "description": "SHA-256 of everything else in this policy. It changes whenever the\nenvironment policy, the stored policy or a catalog route it names\nchanges, so consumers cache by it.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "policyVersion": {
            "description": "The stored policy's version (tenant_model_policy._version). 0 when the\nWorkspace has no stored policy.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "vertexProject": {
            "description": "The Workspace's Parable-owned Vertex project, once tenant-infra-api has\nrecorded it ready (PARABLE-4671). Null means the environment's shared\nproject: none is set, or the one set is not ready yet. Vertex calls for\nthe Workspace run in this project; it is routing only and never part of a\nmodel identity.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "tenantId",
          "policyVersion",
          "digest",
          "capabilities"
        ],
        "type": "object"
      },
      "EffectiveRaciAudienceDefinition": {
        "description": "A delivery audience derived from current effective RACI; it never grants API access.",
        "properties": {
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "effectiveRoles": {
            "items": {
              "$ref": "#/components/schemas/ParableRaciRoleEnum"
            },
            "type": "array"
          }
        },
        "required": [
          "actorRef",
          "effectiveRoles"
        ],
        "type": "object"
      },
      "EmbedModelChoice": {
        "additionalProperties": false,
        "description": "An embedding model. Embedding choices are platform-only in v1. As a\ncapability's defaultChoice or a Workspace default the processor is VERTEX;\na platform candidate (PlatformModelCandidate) names its own processor.",
        "properties": {
          "identity": {
            "$ref": "#/components/schemas/EmbedModelIdentity"
          },
          "kind": {
            "$ref": "#/components/schemas/ModelChoiceKind"
          }
        },
        "required": [
          "kind",
          "identity"
        ],
        "type": "object"
      },
      "EmbedModelIdentity": {
        "additionalProperties": false,
        "description": "The identity that makes stored vectors comparable (EDR-0083): two vectors\ncompare only when every field matches. The server that computes a vector is\nrouting, never identity, so it is absent.",
        "properties": {
          "dimensions": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "normalization": {
            "minLength": 1,
            "type": "string"
          },
          "provider": {
            "minLength": 1,
            "type": "string"
          },
          "variant": {
            "minLength": 1,
            "type": "string"
          },
          "version": {
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "provider",
          "name",
          "variant",
          "version",
          "dimensions",
          "normalization"
        ],
        "type": "object"
      },
      "EncryptionAlgorithm": {
        "description": "Encryption algorithm used for credential encryption.",
        "enum": [
          "AES_256_GCM_RSA_OAEP_256",
          "RSA_OAEP_256",
          "NONE"
        ],
        "type": "string"
      },
      "EnrollDeviceInput": {
        "description": "Device-facing enrollment request (Pulse 0007 Section 3). Authenticated by\nthe single-use enrollment secret, not a user session. The device generates\nits keypair first (in the Secure Enclave where the Mac has one) and sends\nonly the public half.",
        "properties": {
          "deviceKeyKind": {
            "description": "Where the device keeps the private half (PARABLE-7168): hardware (the\nSecure Enclave) or software. Stored on the device record for admins.\nOptional, because Pulse versions before PARABLE-7168 do not send it;\nthe record then holds null. A value outside the enum is refused.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/DeviceKeyKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "devicePubKey": {
            "description": "Device public key: base64 of the 65-byte uncompressed SEC1 P-256 point.",
            "type": "string"
          },
          "displayHint": {
            "description": "Display hint for fleet admin surfaces (user UPN, device name). Written\nonce here, never carried on payloads.",
            "maxLength": 255,
            "nullable": true,
            "type": "string"
          },
          "enrollmentSecret": {
            "description": "The one-time enrollment secret delivered via MDM.",
            "type": "string"
          }
        },
        "required": [
          "enrollmentSecret",
          "devicePubKey"
        ],
        "type": "object"
      },
      "EnrollDeviceResult": {
        "description": "Result of a successful enrollment. The device persists deviceRef, its\ningest token, and the endpoint, and starts signing batches with its device\nkey. Content encryption is keyed by the tenant's content-encryption KMS key\n(fetched separately from the security surface); there is no per-tenant key\nversion.",
        "properties": {
          "capturePolicy": {
            "description": "The apps Pulse skips on this Workspace's Macs (PARABLE-7170), so the\nMac applies them before its first capture after enrollment. web-api\nalways sets it. A device reads a missing value as an empty list.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PulseCapturePolicy"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "deviceRef": {
            "description": "Stable device identity to present on every batch.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ingestEndpointUrl": {
            "description": "Full collector batches endpoint URL embedding the ingest token\n(e.g. https://incoming.parable.work/v1/{token}/agent/v1/batches). Null\nexactly when ingestToken is null.",
            "nullable": true,
            "type": "string"
          },
          "ingestToken": {
            "description": "Plaintext of the tap's shared routing ingest token: every device on\nthe connector's activity tap receives the same token (minted by the\nfirst enrollment, reused after). For device-key taps the URL token is\nrouting only, not a credential -- authenticity is the per-device ES256\nsignature plus ACTIVE device status, and revocation is per-device.\nPersist in the device keychain, nowhere else.\n\nNull when an admin revoked the tap's newest token and minted no new\none (PARABLE-7149): enrollment does not undo that revoke. The device\nenrolls, holds its sends, and gets the token from\nrefreshDeviceRoutingToken after an admin mints one.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "deviceRef"
        ],
        "type": "object"
      },
      "Error": {
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "ErrorBodyRule": {
        "description": "Rule for classifying HTTP errors by inspecting the response body.\nWhen the HTTP status code matches, a JMESPath expression extracts a value\nfrom the body and compares it against the retry and empty lists.",
        "properties": {
          "emptyValues": {
            "description": "Values that mean the provider found no records for the request (Gong\nanswers an empty window with a 404 naming it). A matching response is a\npage with zero records and the read completes; it is not an error and\nnot a refusal (PARABLE-2059).",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "jmesPath": {
            "description": "JMESPath expression to extract a value from the response body",
            "type": "string"
          },
          "retryValues": {
            "description": "Values that indicate the error is transient and should be retried",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "statusCode": {
            "description": "HTTP status code this rule applies to",
            "format": "double",
            "type": "number"
          }
        },
        "required": [
          "statusCode",
          "jmesPath"
        ],
        "type": "object"
      },
      "ExistingMessageParableProblemRunTriggerInput": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemRunTriggerKindEnum"
          },
          "messageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "messageId"
        ],
        "type": "object"
      },
      "ExplainSourcePermissionsInput": {
        "additionalProperties": false,
        "description": "Asks why one person reads, or does not read, one row of a modeled table.",
        "properties": {
          "anchorKey": {
            "description": "The row's value in the table's anchor column.",
            "maxLength": 4096,
            "minLength": 1,
            "type": "string"
          },
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "providerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "email",
          "providerKey",
          "tableKey",
          "anchorKey"
        ],
        "type": "object"
      },
      "ExternalSourceRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableSourceRefKindEnum"
          },
          "label": {
            "nullable": true,
            "type": "string"
          },
          "uri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "uri"
        ],
        "type": "object"
      },
      "ExternalToolCallRef": {
        "properties": {
          "adapter": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "toolCallId": {
            "type": "string"
          }
        },
        "required": [
          "adapter",
          "toolCallId"
        ],
        "type": "object"
      },
      "ExternalWorkflowRunRef": {
        "properties": {
          "adapter": {
            "$ref": "#/components/schemas/ParableProblemRunAdapterEnum"
          },
          "workflowRunId": {
            "type": "string"
          }
        },
        "required": [
          "adapter",
          "workflowRunId"
        ],
        "type": "object"
      },
      "FactMessageCausationRef": {
        "properties": {
          "factChangeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ProblemMessageCausationKindEnum"
          }
        },
        "required": [
          "kind",
          "factChangeId"
        ],
        "type": "object"
      },
      "FieldDiscoveryConfig": {
        "description": "Configuration for runtime field discovery.\nSome APIs (e.g., Salesforce) use a wildcard token like FIELDS(ALL) that only\nworks below a field-count threshold. This config tells the ingestion engine\nhow to call a describe/schema endpoint, enumerate queryable fields, and\nsubstitute the wildcard with the explicit field list before executing queries.",
        "properties": {
          "endpointTemplate": {
            "description": "Describe endpoint template with {objectName} and {apiVersion} placeholders",
            "type": "string"
          },
          "excludeFieldTypes": {
            "description": "Field types to exclude from the resolved list (e.g., ['address', 'location'])",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "fieldArrayPath": {
            "description": "Path to field array in describe response (e.g., 'fields')",
            "type": "string"
          },
          "fieldNameKey": {
            "description": "Key for field name in each descriptor object (e.g., 'name')",
            "type": "string"
          },
          "fieldTypeKey": {
            "description": "Key for field type in each descriptor object (e.g., 'type')",
            "type": "string"
          },
          "includeCondition": {
            "description": "Optional condition for including fields (e.g., only queryable fields)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/FieldDiscoveryIncludeCondition"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "objectNameField": {
            "description": "Tap field that holds the API object name (default: 'objectName')",
            "type": "string"
          },
          "wildcardToken": {
            "description": "Token to replace with resolved field list (e.g., 'FIELDS(ALL)')",
            "type": "string"
          }
        },
        "required": [
          "endpointTemplate",
          "objectNameField",
          "fieldArrayPath",
          "fieldNameKey",
          "fieldTypeKey",
          "wildcardToken"
        ],
        "type": "object"
      },
      "FieldDiscoveryIncludeCondition": {
        "description": "=============================================================================\nField Discovery\n=============================================================================\nCondition for including a field during field discovery.\nAllows filtering describe-endpoint results by a boolean or enum property.",
        "properties": {
          "key": {
            "description": "Field key to check on each field descriptor (e.g., 'queryable')",
            "type": "string"
          },
          "value": {
            "description": "Required value for inclusion (e.g., true)"
          }
        },
        "required": [
          "key",
          "value"
        ],
        "type": "object"
      },
      "FinalizeArtifactPublicationInput": {
        "additionalProperties": false,
        "properties": {
          "namespaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "retryFailed": {
            "description": "Resume unchanged failed inputs; corrected inputs require a new revision.",
            "type": "boolean"
          },
          "revisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "namespaceId",
          "revisionId",
          "retryFailed"
        ],
        "type": "object"
      },
      "GraphQLEndpointConfig": {
        "additionalProperties": false,
        "description": "GraphQL API endpoint configuration.\nFor connectors that use GraphQL APIs (e.g., Linear).\nStrict for the same reason as RestEndpointConfig: every key shapes the\nProvider request (PARABLE-4569). `variables` stays free-form.",
        "properties": {
          "endpoint": {
            "description": "GraphQL endpoint path",
            "type": "string"
          },
          "operationName": {
            "description": "GraphQL operation name",
            "nullable": true,
            "type": "string"
          },
          "query": {
            "description": "GraphQL query or mutation string",
            "type": "string"
          },
          "variables": {
            "description": "Static variables to include in every request",
            "nullable": true
          }
        },
        "required": [
          "endpoint",
          "query"
        ],
        "type": "object"
      },
      "HarnessRuntimeExecutionTarget": {
        "properties": {
          "harnessPluginReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ModelExecutionTargetKindEnum"
          },
          "runtimeCapabilityId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "harnessPluginReleaseId",
          "runtimeCapabilityId"
        ],
        "type": "object"
      },
      "HatchPetInput": {
        "description": "Hatch one random, previously unseen Pet for the current person.",
        "properties": {
          "devUnlimitedPets": {
            "description": "Development-only request to bypass the person's on-screen Pet limit. Ignored elsewhere.",
            "type": "boolean"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "idempotencyKey",
          "devUnlimitedPets"
        ],
        "type": "object"
      },
      "HatchPetResult": {
        "properties": {
          "eggsRemaining": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "message": {
            "description": "Ready-to-display confirmation such as \"Patrice the Parable Pickle hatched!\".",
            "type": "string"
          },
          "pet": {
            "$ref": "#/components/schemas/PersonPet"
          }
        },
        "required": [
          "pet",
          "eggsRemaining",
          "message"
        ],
        "type": "object"
      },
      "HttpMethodEnum": {
        "description": "HTTP method for API calls.",
        "enum": [
          "GET",
          "POST",
          "PUT",
          "PATCH",
          "DELETE"
        ],
        "type": "string"
      },
      "ImmediatePlotQueryInput": {
        "description": "One SQL statement to run once against the Workspace's Query Layer.\nweb-api caps no rows. The result is every row the statement returns, up to\nthe Query Layer's own row cap, which fails the query rather than truncating\nit (QL-SQ-005). To read fewer rows, write a LIMIT in the SQL. A reader may\nalso stop reading early: the browser stops at its display limit and the tool\nbinding at 3 MiB of Arrow.",
        "properties": {
          "commitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedRefRevision": {
            "description": "Draft definition revision observed by the React host. Requires refId;\nexecution refuses a stale revision instead of relabeling old code as new.\nOmitted means the caller deliberately requests the latest authorized ref.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "jev": {
            "description": "Jev defaults for this query only. SQL model arguments override the default.\nThe null policy applies to recoverable input, provider and response failures.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/JevSessionOptions"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "parameters": {
            "description": "Positional values for $1, $2, ... placeholders, sent through Flight SQL\nprepared-statement binding. Values are never interpolated into SQL.\nEach value is a JSON scalar (string, finite number, boolean, or null).\nOmitted/null/empty uses the ordinary unparameterized query path.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "nullable": true,
            "type": "array"
          },
          "reading": {
            "description": "Host-selected data reading. Omitted raw SQL requests Current; a bound React\nPlot always sends its canonical context.data. Unsupported Report execution\nis refused explicitly rather than silently relabeled as Current.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlotDataReading"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "refId": {
            "description": "Where the Plot runs (Pieces v2). At most one of the two: `refId` is the\nref being viewed (a Proposal draft, or a Personal-mode root), `commitId`\nis a published line's pin. web-api resolves the root ref and forwards\nthem to the query layer as the caller's `parableScope`, which is how\n`workspace.preferences` serves the right Parable-scope rows. Both absent\nmeans the Plot reads no Preferences.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sql": {
            "description": "Single SQL statement. Text.Sql rejects empty; maxLength is 100000 bytes.",
            "maxLength": 100000,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "sql"
        ],
        "type": "object"
      },
      "ImmediatePlotQueryResult": {
        "description": "What a tool caller (an MCP client, or Ponder through its broker) receives\nfrom executeImmediatePlotQuery. The HTTP route streams Arrow; the tool\nbinding reads that stream up to 3 MiB of Arrow and returns this one object.",
        "properties": {
          "arrowIpcBase64": {
            "description": "Standard Arrow IPC stream, base64-encoded for JSON transport. It always\nends with the IPC end-of-stream marker, including when truncated.",
            "type": "string"
          },
          "elapsedMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "rowCount": {
            "description": "Rows in arrowIpcBase64. A stored result without this field was written\nbefore the route streamed, when web-api capped rows itself.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "truncated": {
            "description": "True when the binding stopped reading before the end of the result, so\nthe query returns more rows than arrowIpcBase64 holds.",
            "type": "boolean"
          }
        },
        "required": [
          "arrowIpcBase64",
          "rowCount",
          "truncated",
          "elapsedMs"
        ],
        "type": "object"
      },
      "InboundAuthStrategy": {
        "description": "Inbound sender verification strategy for a collector (push-ingestion)\nconnector. Web projection; see the db type for main reference.",
        "properties": {
          "configSchema": {
            "description": "Schema for the verification credentials the tenant must supply at\nconnector setup. Stored in the runtime-IR wire form (secret fields have\n`secret: true`; \"x-secret\": true in the JSON-Schema authoring form).",
            "nullable": true,
            "type": "object"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "handshakeKind": {
            "$ref": "#/components/schemas/InboundHandshakeKindEnum",
            "description": "Subscription-time validation dance performed when the tenant registers the\ningest URL in the vendor console"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "label": {
            "description": "Display label for this strategy in setup flows",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "replayWindowSeconds": {
            "description": "Maximum accepted age, in seconds, of the timestampHeader value",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "signatureBase": {
            "description": "Template for the string the sender signs. Placeholders: {timestamp}, {body}.\nExample (Slack): \"v0:{timestamp}:{body}\"",
            "nullable": true,
            "type": "string"
          },
          "signatureHeader": {
            "description": "Header carrying the sender's signature (when verificationType = HMAC_SHA256)",
            "nullable": true,
            "type": "string"
          },
          "timestampHeader": {
            "description": "Header carrying the sender's request timestamp for replay protection",
            "nullable": true,
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "verificationType": {
            "$ref": "#/components/schemas/InboundVerificationTypeEnum",
            "description": "How the collector verifies the sender of a pushed payload"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "verificationType",
          "handshakeKind"
        ],
        "type": "object"
      },
      "InboundHandshakeKindEnum": {
        "description": "Subscription-time validation dance a webhook provider performs when the\ntenant registers the ingest URL in the vendor console. The collector\nimplements each kind exactly once; the set is deliberately bounded.",
        "enum": [
          "none",
          "slack_url_verification",
          "ms_graph_validation_token"
        ],
        "type": "string"
      },
      "InboundVerificationTypeEnum": {
        "description": "How the collector verifies a push sender (inbound requests to\nincoming.parable.work). The mirror image of AuthMethodEnum, which covers\noutbound API calls the platform makes. Each kind is implemented exactly once\nin the collector service; adding a webhook provider that reuses an existing\nkind is seed data only.",
        "enum": [
          "hmac_sha256",
          "bearer_token",
          "device_key",
          "none"
        ],
        "type": "string"
      },
      "IncrementalFilterTypeEnum": {
        "description": "Type of incremental filtering to apply.",
        "enum": [
          "simple",
          "query_template",
          "body_filter"
        ],
        "type": "string"
      },
      "IncrementalParamsConfig": {
        "description": "Configuration for incremental sync time-based filtering.",
        "properties": {
          "bodyFilterEndPath": {
            "description": "Optional second POST-body path for the window end bound (e.g. monday\nactivity_logs variables.to alongside variables.from).",
            "nullable": true,
            "type": "string"
          },
          "bodyFilterFormat": {
            "description": "Format for body filter timestamp value",
            "oneOf": [
              {
                "$ref": "#/components/schemas/IncrementalTimeFormatEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "bodyFilterPath": {
            "description": "Dot-notation path in POST body for time filter injection",
            "nullable": true,
            "type": "string"
          },
          "bodyFilterTemplate": {
            "description": "Template for body filter with {window_start} and {window_end} placeholders",
            "nullable": true,
            "type": "string"
          },
          "filterType": {
            "description": "Type of incremental filtering to apply",
            "oneOf": [
              {
                "$ref": "#/components/schemas/IncrementalFilterTypeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "maxWindowDays": {
            "description": "Maximum number of days per sync window. APIs with date range limits (e.g., Microsoft Graph 30 days, Zoom 30 days) are automatically split into sub-windows.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "queryParam": {
            "description": "Query parameter for template-based filters (e.g., 'q' for Gmail)",
            "nullable": true,
            "type": "string"
          },
          "queryTemplate": {
            "description": "Template with {window_start} and {window_end} placeholders",
            "nullable": true,
            "type": "string"
          },
          "sinceFormat": {
            "description": "Format for the since parameter value",
            "oneOf": [
              {
                "$ref": "#/components/schemas/IncrementalTimeFormatEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "sinceParam": {
            "description": "Query parameter name for start time filter (e.g., 'since', 'oldest')",
            "nullable": true,
            "type": "string"
          },
          "untilFormat": {
            "description": "Format for the until parameter value",
            "oneOf": [
              {
                "$ref": "#/components/schemas/IncrementalTimeFormatEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "untilParam": {
            "description": "Query parameter name for end time filter (e.g., 'until', 'latest')",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "IncrementalTimeFormatEnum": {
        "description": "Format for incremental sync time parameters.",
        "enum": [
          "iso8601",
          "iso8601_z",
          "iso8601_seconds_z",
          "unix",
          "unix_millis",
          "unix_micros",
          "unix_nanos",
          "date_slash",
          "date"
        ],
        "type": "string"
      },
      "InformProblemPingPurpose": {
        "properties": {
          "audience": {
            "$ref": "#/components/schemas/ProblemPingAudienceEnum"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "audience"
        ],
        "type": "object"
      },
      "InformProblemPingPurposeInput": {
        "properties": {
          "audience": {
            "$ref": "#/components/schemas/ProblemPingAudienceEnum"
          }
        },
        "required": [
          "audience"
        ],
        "type": "object"
      },
      "IngestTokenInfo": {
        "description": "An ingest token belonging to one of the tenant's collector taps. Projection\nof web-db IngestToken that never exposes the SHA-256 hash. The plaintext is\nreturned exactly once at mint/rotation via MintIngestTokenResult.token;\nafterwards the prefix is the only user-visible identifier. Lifecycle is\ntimestamp-derived: revokedAt set = rejected immediately (modulo collector\ncache TTL); expiresAt in the past = rejected (rotation grace elapsed).",
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "expiresAt": {
            "description": "Rotation grace expiry. Set on the outgoing token when a rotation mints its\nreplacement; after expiresAt the token is rejected. Null = no expiry.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lastUsedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "prefix": {
            "description": "First characters of the plaintext token, shown in lists so the tenant can\nidentify which token is which.",
            "type": "string"
          },
          "revokedAt": {
            "description": "Set when the token was revoked. Revoked tokens are kept for audit but\nimmediately rejected.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "rotatedAt": {
            "description": "Set when the token was rotated (a replacement row was minted).",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "tenantConnectorTapId": {
            "description": "Flattened Relation\u003cTenantConnectorTap\u003e for the wire.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "updatedAt",
          "tenantConnectorTapId",
          "prefix"
        ],
        "type": "object"
      },
      "IntegrationClassEnum": {
        "description": "High-level integration class determining how data is extracted from a connector.\nDrives protocol module selection in the research pipeline and transport handler\nrouting in the ingestion engine.",
        "enum": [
          "api",
          "database",
          "file",
          "streaming",
          "meta_tool",
          "custom"
        ],
        "type": "string"
      },
      "InviteCodeStatus": {
        "description": "=====================================================\nInvite Code Status Enum\n=====================================================\nWhere a self-serve signup invite code stands (PARABLE-4348). Derived from\nthe code's timestamps, never stored.",
        "enum": [
          "ACTIVE",
          "REDEEMED",
          "EXPIRED",
          "REVOKED"
        ],
        "type": "string"
      },
      "InviteTenantUserInput": {
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "roleIds": {
            "description": "Role IDs to assign to the user upon invite. At least one role is required.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "email",
          "roleIds"
        ],
        "type": "object"
      },
      "InviteUserWithDefaultRoleInput": {
        "description": "An invitation that gives the Workspace's default role, the one an agent\nsends (PARABLE-5432). It names no roles: only a person chooses those.",
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "InvokeParableProblemMessageToolInput": {
        "additionalProperties": false,
        "properties": {
          "arguments": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "argumentsDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "operationId": {
            "maxLength": 512,
            "minLength": 1,
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableProblemMessageToolScope"
          },
          "toolCallId": {
            "maxLength": 512,
            "minLength": 1,
            "type": "string"
          },
          "toolName": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "scope",
          "toolCallId",
          "operationId",
          "toolName",
          "arguments",
          "argumentsDigest"
        ],
        "type": "object"
      },
      "InvokeParableProblemMessageToolResult": {
        "properties": {
          "changedResourceIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 0,
            "type": "array"
          },
          "domainChanged": {
            "description": "Safe same-tab refresh signal; contains no resource identity or operation arguments.",
            "type": "boolean"
          },
          "failureCode": {
            "description": "Safe code only; raw Provider/system errors are excluded.",
            "nullable": true,
            "type": "string"
          },
          "output": {
            "description": "Any valid JSON value: object, array, primitive, or null",
            "nullable": true
          },
          "recovery": {
            "description": "What the model should do next after an outcome other than completed.",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemMessageToolInvocationStatusEnum"
          }
        },
        "required": [
          "status",
          "changedResourceIds",
          "domainChanged"
        ],
        "type": "object"
      },
      "InvokeParableProblemRunToolInput": {
        "properties": {
          "arguments": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "argumentsDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "contextSnapshot": {
            "$ref": "#/components/schemas/ParableProblemContextSnapshot"
          },
          "expectedRunRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "operationId": {
            "type": "string"
          },
          "toolCallId": {
            "type": "string"
          },
          "toolName": {
            "type": "string"
          },
          "workflowAdapter": {
            "$ref": "#/components/schemas/ParableProblemRunAdapterEnum"
          },
          "workflowRunId": {
            "type": "string"
          }
        },
        "required": [
          "workflowAdapter",
          "workflowRunId",
          "expectedRunRevision",
          "toolCallId",
          "operationId",
          "toolName",
          "arguments",
          "argumentsDigest",
          "contextSnapshot",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "InvokeParableProblemRunToolResult": {
        "properties": {
          "approvalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "attemptCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "changedResourceIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 0,
            "type": "array"
          },
          "claimLeaseExpiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "claimToken": {
            "description": "Present only while another exact broker claim owns the invocation.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "diagnosticEventId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "domainChanged": {
            "description": "Safe same-tab refresh signal; contains no resource identity or operation arguments.",
            "type": "boolean"
          },
          "failureCode": {
            "description": "Safe code only; raw Provider/system errors are excluded.",
            "nullable": true,
            "type": "string"
          },
          "output": {
            "description": "Any valid JSON value: object, array, primitive, or null",
            "nullable": true
          },
          "receiptId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "runRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemRunToolInvocationStatusEnum"
          }
        },
        "required": [
          "status",
          "attemptCount",
          "runRevision",
          "changedResourceIds",
          "domainChanged"
        ],
        "type": "object"
      },
      "IssueParableProblemMessageToolApprovalInput": {
        "additionalProperties": false,
        "properties": {
          "approvalId": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "arguments": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "argumentsDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "assistantMessageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "committedExecution": {
            "$ref": "#/components/schemas/PonderParableCommittedExecution"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "nativeToolName": {
            "$ref": "#/components/schemas/ParableProblemMessageNativeToolEnum"
          },
          "operationId": {
            "type": "string"
          },
          "safeConsequence": {
            "description": "Markdown text",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "safeInputSummary": {
            "description": "Markdown text",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableProblemMessageToolScope"
          },
          "signature": {
            "description": "AI SDK approval signature: base64url characters only.",
            "maxLength": 128,
            "minLength": 43,
            "type": "string"
          },
          "toolCallId": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "toolHandle": {
            "type": "string"
          }
        },
        "required": [
          "scope",
          "nativeToolName",
          "committedExecution",
          "assistantMessageId",
          "approvalId",
          "signature",
          "toolCallId",
          "toolHandle",
          "operationId",
          "arguments",
          "argumentsDigest",
          "safeInputSummary",
          "safeConsequence",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "IssueParableProblemMessageToolApprovalResult": {
        "properties": {
          "approvalId": {
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/ParableProblemMessageToolApprovalStateEnum"
          }
        },
        "required": [
          "approvalId",
          "state"
        ],
        "type": "object"
      },
      "JevModelChoice": {
        "additionalProperties": false,
        "description": "A Jev model version, such as `jev-1.13.0`. TypeSafe serves Jev, so the processor is TYPESAFE.",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ModelChoiceKind"
          },
          "version": {
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "kind",
          "version"
        ],
        "type": "object"
      },
      "JevOnError": {
        "enum": [
          "fail",
          "null"
        ],
        "type": "string"
      },
      "JevSessionOptions": {
        "additionalProperties": false,
        "description": "Query-local controls. Credentials and the endpoint are server configuration.\nA null model leaves the choice to the Workspace model policy (PARABLE-4672):\nthe Workspace's SQL_JEV default, else the platform default.",
        "properties": {
          "model": {
            "nullable": true,
            "type": "string"
          },
          "on_error": {
            "$ref": "#/components/schemas/JevOnError"
          }
        },
        "required": [
          "on_error"
        ],
        "type": "object"
      },
      "JoinTenantInput": {
        "properties": {
          "tenantSlug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "tenantSlug"
        ],
        "type": "object"
      },
      "JudgmentChoiceGroup": {
        "description": "Ponder's language operations (PARABLE-4309). Pick, prioritize and probe ask\nJev typed questions (PONDER_JUDGMENT); cleanup asks Jev to choose among\ncorrections the server proposes (PONDER_CLEANUP); summarize asks a text\nmodel through ponder-api (PONDER_NAMING). Each call resolves its model\nthrough the Workspace model policy and is refused when the policy allows\nno processor for it. The question shapes follow the System One API with\nprovider-neutral names: `options`, `levels` and `whenTrue`/`whenFalse`.\nOptions that belong together. With groups, pick chooses among the groups first, then among their members.",
        "properties": {
          "description": {
            "description": "What the group holds, as the model will read it."
          },
          "options": {
            "description": "Keys from the question's options. An option may belong to several groups.",
            "items": {
              "type": "string"
            },
            "maxItems": 20000,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "description",
          "options"
        ],
        "type": "object"
      },
      "JudgmentChoiceQuestion": {
        "properties": {
          "groups": {
            "additionalProperties": {
              "$ref": "#/components/schemas/JudgmentChoiceGroup"
            },
            "description": "Optional. Up to 255 groups; every option must belong to at least one.",
            "nullable": true,
            "type": "object"
          },
          "instructions": {
            "description": "The decision, as the model will read it. Refer to parts of the state as `path.to.field`."
          },
          "options": {
            "additionalProperties": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "description": "Option key to its description, or null when the key says enough. 2 to\n20,000 options; above 255 the server narrows them in rounds.",
            "nullable": true,
            "type": "object"
          }
        },
        "required": [
          "instructions"
        ],
        "type": "object"
      },
      "JudgmentProbeQuestion": {
        "properties": {
          "instructions": {
            "description": "A yes-or-no question."
          },
          "whenFalse": {
            "description": "Optional: what a no means.",
            "nullable": true
          },
          "whenTrue": {
            "description": "Optional: what a yes means.",
            "nullable": true
          }
        },
        "required": [
          "instructions"
        ],
        "type": "object"
      },
      "JudgmentProvenance": {
        "description": "Which model answered. Store `model` with any answer you keep.",
        "properties": {
          "inputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "model": {
            "description": "The Jev release, as TypeSafe reported it.",
            "type": "string"
          },
          "requests": {
            "description": "Requests sent to the model; more than one when a pick ran in rounds.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "model",
          "requests",
          "inputTokens"
        ],
        "type": "object"
      },
      "JudgmentScoreQuestion": {
        "properties": {
          "instructions": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "levels": {
            "description": "Ordered levels, lowest first. Each describes a concrete situation on its own.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "maxItems": 10,
            "minItems": 2,
            "type": "array"
          }
        },
        "required": [
          "instructions",
          "levels"
        ],
        "type": "object"
      },
      "LabPackageFileEditInput": {
        "additionalProperties": false,
        "description": "One file that an edit to a Lab package sets or deletes (PARABLE-7230).\n`text` is the whole new UTF-8 content of the file at `path`. Null deletes\nthe file. An edit carries text only: an image or another binary asset\nchanges through a ZIP import. web-api's Lab package edit operations take a\nlist of these, and services/pkg/parable applies them to the Lab's current\npackage files before the Lab package planner runs.",
        "properties": {
          "path": {
            "description": "A file system path",
            "minLength": 1,
            "type": "string"
          },
          "text": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "type": "object"
      },
      "LabPlotDeclaration": {
        "additionalProperties": false,
        "description": "One Plot a Lab package declares in parable.lab.json (PARABLE-7230). The Lab\nimport makes one Plot for each declaration on the Lab data Pane and keeps its\nSQL in that Plot's SQL implementation, not in the app files. `slug` is the\nPlot's catalog name (`parables.\u003cparable\u003e.\u003cslug\u003e`) and the key that matches a\ndeclaration to its Plot on the next import. `sql` is the package path of the\nPlot's SQL file. It ends in `.sql`.",
        "properties": {
          "name": {
            "type": "string"
          },
          "slug": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "sql": {
            "type": "string"
          }
        },
        "required": [
          "slug",
          "name",
          "sql"
        ],
        "type": "object"
      },
      "LegacyParableProblemRunPersonaResolution": {
        "description": "Backward-readable projection for Runs created before Persona catalog resolution existed.",
        "properties": {
          "configurationDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemRunPersonaResolutionKindEnum"
          },
          "modelReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "routeBindingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/PersonaResolutionSourceEnum"
          }
        },
        "required": [
          "kind",
          "source",
          "modelReleaseId",
          "routeBindingId",
          "configurationDigest"
        ],
        "type": "object"
      },
      "LoadParableProblemRunStepInput": {
        "additionalProperties": false,
        "description": "ponder-api loads what one turn segment needs before it runs.",
        "properties": {
          "attempt": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "stepIndex",
          "attempt"
        ],
        "type": "object"
      },
      "LoginMethodEnum": {
        "description": "Parable-owned login method identifiers (aligned with Stytch B2B allowed_auth_methods / SSO).",
        "enum": [
          "magic_link",
          "passkey",
          "google",
          "microsoft",
          "oidc",
          "saml"
        ],
        "type": "string"
      },
      "LogoutAllResult": {
        "description": "Result of logging out all sessions except the current one",
        "properties": {
          "message": {
            "type": "string"
          },
          "revokedSessionCount": {
            "description": "Number of sessions that were revoked",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "success": {
            "type": "boolean"
          }
        },
        "required": [
          "success",
          "message",
          "revokedSessionCount"
        ],
        "type": "object"
      },
      "LookupTenantMatch": {
        "properties": {
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantName": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "tenantSlug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "tenantId",
          "tenantSlug",
          "tenantName"
        ],
        "type": "object"
      },
      "LookupTenantsInput": {
        "description": "SSO / SCIM / breakglass API types (web-api)",
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "LookupTenantsResult": {
        "properties": {
          "tenants": {
            "items": {
              "$ref": "#/components/schemas/LookupTenantMatch"
            },
            "type": "array"
          }
        },
        "required": [
          "tenants"
        ],
        "type": "object"
      },
      "MaintenanceAction": {
        "description": "Action recorded by one Delta-maintenance run against a contract.",
        "enum": [
          "NONE",
          "OPTIMIZE",
          "OPTIMIZE_ZORDER",
          "VACUUM",
          "OPTIMIZE_AND_VACUUM"
        ],
        "type": "string"
      },
      "MarkParableProblemPingReadInput": {
        "properties": {
          "expectedInboxItemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedInboxItemRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "MessageAttachmentPart": {
        "properties": {
          "attachment": {
            "description": "Generic file metadata",
            "type": "object"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemMessagePartKindEnum"
          }
        },
        "required": [
          "kind",
          "attachment"
        ],
        "type": "object"
      },
      "MessageErrorPart": {
        "properties": {
          "error": {
            "$ref": "#/components/schemas/ParableErrorView"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemMessagePartKindEnum"
          }
        },
        "required": [
          "kind",
          "error"
        ],
        "type": "object"
      },
      "MessageHarnessActivityPart": {
        "description": "Safe product projection of a harness-native event; never raw terminal or provider payload.",
        "properties": {
          "activity": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "artifactIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemMessagePartKindEnum"
          },
          "summary": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "activity",
          "summary",
          "artifactIds"
        ],
        "type": "object"
      },
      "MessageReasoningSummaryPart": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemMessagePartKindEnum"
          },
          "summary": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "summary"
        ],
        "type": "object"
      },
      "MessageRegardingMessage": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableMessageRegardingKindEnum"
          },
          "messageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "messageId"
        ],
        "type": "object"
      },
      "MessageRegardingPiece": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableMessageRegardingKindEnum"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "pieceId"
        ],
        "type": "object"
      },
      "MessageSourcePart": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemMessagePartKindEnum"
          },
          "source": {
            "$ref": "#/components/schemas/ParableSourceRef"
          }
        },
        "required": [
          "kind",
          "source"
        ],
        "type": "object"
      },
      "MessageTextPart": {
        "properties": {
          "content": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemMessagePartKindEnum"
          }
        },
        "required": [
          "kind",
          "content"
        ],
        "type": "object"
      },
      "MessageToolActivityPart": {
        "properties": {
          "activity": {
            "$ref": "#/components/schemas/ToolActivityView"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemMessagePartKindEnum"
          },
          "toolExportId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "toolExportId",
          "activity"
        ],
        "type": "object"
      },
      "MessageToolApprovalPart": {
        "properties": {
          "approval": {
            "$ref": "#/components/schemas/ToolApprovalView"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemMessagePartKindEnum"
          }
        },
        "required": [
          "kind",
          "approval"
        ],
        "type": "object"
      },
      "MilestoneContentVariantEnum": {
        "description": "Milestone Content Variant -- discriminates how a milestone's expanded content renders.\nFIXED_PROVIDERS: static list of named data providers (e.g., AI Spend milestone).\nDYNAMIC_TOOL_GROUPS: tool groups populated from tenant's active connectors (e.g., AI Add-Ons).",
        "enum": [
          "fixed_providers",
          "dynamic_tool_groups"
        ],
        "type": "string"
      },
      "MilestoneDelegationCategoryItemInput": {
        "description": "Per-category connector selection for a DYNAMIC_TOOL_GROUPS milestone",
        "properties": {
          "categoryId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "connectorIds": {
            "description": "Specific connector IDs the viewer selected from this category.\nEmpty list means 'send to all connectors in this category' -- server resolves at send time.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "categoryId",
          "connectorIds"
        ],
        "type": "object"
      },
      "MilestoneDelegationLineItemInput": {
        "description": "Per-milestone selections for a delegation request",
        "properties": {
          "categoryItems": {
            "description": "DYNAMIC_TOOL_GROUPS: one entry per category the viewer selected.\nEach entry carries the category and the specific connectors chosen within it.\nEmpty connectorIds within an entry means 'all connectors in this category'.",
            "items": {
              "$ref": "#/components/schemas/MilestoneDelegationCategoryItemInput"
            },
            "nullable": true,
            "type": "array"
          },
          "connectorIds": {
            "description": "FIXED_PROVIDERS: connector IDs the viewer explicitly checked.\n'Send to all' is represented as all provider connector IDs pre-filled by the client.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "milestoneId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "milestoneId",
          "connectorIds"
        ],
        "type": "object"
      },
      "MilestoneDelegationResult": {
        "description": "Result returned after creating a data milestone delegation request.",
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parableDefinitionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/MilestoneDelegationStatusEnum"
          }
        },
        "required": [
          "id",
          "createdAt",
          "parableDefinitionId",
          "status"
        ],
        "type": "object"
      },
      "MilestoneDelegationStatusEnum": {
        "description": "Status of a data milestone request lifecycle.",
        "enum": [
          "pending",
          "fulfilled",
          "cancelled"
        ],
        "type": "string"
      },
      "MilestoneProvider": {
        "description": "A data provider for a FIXED_PROVIDERS or DYNAMIC_TOOL_GROUPS milestone, as returned by the API.\nName and logo are derived from the linked Connector record at query time.",
        "properties": {
          "categoryId": {
            "description": "For DYNAMIC_TOOL_GROUPS providers: the ConnectorCategory this connector was sourced from.\nNull for FIXED_PROVIDERS providers.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "connectorId": {
            "description": "ID of the Connector linked to this provider.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "enabled": {
            "description": "Whether this provider's connector is currently active for the requesting tenant.",
            "type": "boolean"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "logo": {
            "description": "Logo from the Connector record. Null when the connector has no logo.",
            "nullable": true,
            "type": "object"
          },
          "name": {
            "description": "Display name from the Connector (e.g., 'Anthropic', 'GitHub Copilot')",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "sortOrder": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "connectorId",
          "name",
          "sortOrder",
          "enabled"
        ],
        "type": "object"
      },
      "MilestoneRequestRecipientInput": {
        "description": "A single recipient in a data milestone request",
        "properties": {
          "email": {
            "description": "Email address of the integrator",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "MilestoneStateEnum": {
        "description": "Runtime state of a milestone for a specific tenant, derived from connector status.\nNot stored in DB -- computed by the API query layer.",
        "enum": [
          "required",
          "enabled",
          "optional"
        ],
        "type": "string"
      },
      "MintDeviceEnrollmentSecretInput": {
        "description": "Input for minting a device enrollment secret. The tenant connector must be\na desktop agent (DEVICE_KEY) connector belonging to the calling tenant.",
        "properties": {
          "tenantConnectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantConnectorId"
        ],
        "type": "object"
      },
      "MintDeviceEnrollmentSecretResult": {
        "description": "Result of mintDeviceEnrollmentSecret. The plaintext `secret` is returned\nexactly once and is irrecoverable afterwards -- deliver it to the device\nvia MDM configuration and never persist it elsewhere.",
        "properties": {
          "enrollmentSecret": {
            "$ref": "#/components/schemas/DeviceEnrollmentSecretInfo"
          },
          "secret": {
            "description": "One-time plaintext enrollment secret (base62). Persist nowhere.",
            "type": "string"
          }
        },
        "required": [
          "enrollmentSecret",
          "secret"
        ],
        "type": "object"
      },
      "MintIngestTokenInput": {
        "description": "Input for minting a new ingest token. The tap must belong to the calling\ntenant; the service layer enforces this before minting.",
        "properties": {
          "tenantConnectorTapId": {
            "description": "The collector TenantConnectorTap this token routes to.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantConnectorTapId"
        ],
        "type": "object"
      },
      "MintIngestTokenResult": {
        "description": "Result of mintIngestToken and rotateIngestToken. The plaintext `token` is\nreturned exactly once and is irrecoverable afterwards — clients must surface\nit (and the endpointUrl embedding it) to the user immediately and never\nre-fetch.",
        "properties": {
          "endpointUrl": {
            "description": "Full ingest endpoint URL embedding the token, ready to paste into a vendor\nconsole or sender config (e.g. https://incoming.parable.work/v1/{token}).\nShown once alongside the token.",
            "type": "string"
          },
          "ingestToken": {
            "$ref": "#/components/schemas/IngestTokenInfo"
          },
          "token": {
            "description": "One-time plaintext token (base62). Persist nowhere.",
            "type": "string"
          }
        },
        "required": [
          "ingestToken",
          "token",
          "endpointUrl"
        ],
        "type": "object"
      },
      "ModelCapability": {
        "description": "A kind of model call that runs over a Workspace's data (PARABLE-4494). The\nenvironment policy lists the processors each one may use, and a Workspace\nsets a default model for the ones it may choose. The embedding capabilities\nare platform-only in v1: a Workspace sets no default for them.",
        "enum": [
          "PONDER_CHAT",
          "SQL_EMBED",
          "SQL_MODEL",
          "SQL_JEV",
          "POOL_SEARCH_EMBEDDING",
          "SCHEMA_INFERENCE",
          "PONDER_CLEANUP",
          "PONDER_NAMING",
          "PONDER_JUDGMENT",
          "ROW_SEARCH_EMBEDDING",
          "PONDER_LANGUAGE"
        ],
        "type": "string"
      },
      "ModelCapabilityChange": {
        "description": "One capability a proposed change affects, as web-api computes it before\nand after.",
        "properties": {
          "after": {
            "$ref": "#/components/schemas/EffectiveModelCapability"
          },
          "before": {
            "$ref": "#/components/schemas/EffectiveModelCapability"
          },
          "capability": {
            "$ref": "#/components/schemas/ModelCapability"
          },
          "effect": {
            "$ref": "#/components/schemas/ModelCapabilityChangeEffect"
          },
          "recompute": {
            "description": "Set only for DEFAULT_CHANGED on SQL_MODEL or SQL_JEV. Null otherwise,\nand null when the Plots could not be counted: the query layer did not\nanswer or the roster could not be read.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ScheduledPlotRecompute"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "capability",
          "effect",
          "before",
          "after"
        ],
        "type": "object"
      },
      "ModelCapabilityChangeEffect": {
        "description": "What a proposed change to a Workspace's model policy does to one\ncapability (PARABLE-4676).",
        "enum": [
          "UNAVAILABLE",
          "AVAILABLE",
          "DEFAULT_CHANGED"
        ],
        "type": "string"
      },
      "ModelCapabilityDefault": {
        "additionalProperties": false,
        "description": "A Workspace's default model for one capability.",
        "properties": {
          "capability": {
            "$ref": "#/components/schemas/ModelCapability"
          },
          "choice": {
            "$ref": "#/components/schemas/ModelChoice"
          }
        },
        "required": [
          "capability",
          "choice"
        ],
        "type": "object"
      },
      "ModelCapabilityFeature": {
        "additionalProperties": false,
        "description": "The product feature one capability serves, and what a Workspace loses\nwhen no processor may serve it (PARABLE-4676). The Workspace AI processors\npage shows it before a narrowing or a default is saved.",
        "properties": {
          "capability": {
            "$ref": "#/components/schemas/ModelCapability"
          },
          "name": {
            "description": "The feature's name, as a Workspace administrator reads it.",
            "type": "string"
          },
          "whenDefaultChanges": {
            "description": "What a change to the Workspace's default model does to work already\nscheduled. Null when a change reaches only later calls.",
            "nullable": true,
            "type": "string"
          },
          "whenUnavailable": {
            "description": "What stops working when no processor may serve the capability.",
            "type": "string"
          }
        },
        "required": [
          "capability",
          "name",
          "whenUnavailable"
        ],
        "type": "object"
      },
      "ModelChoice": {
        "description": "The model one capability uses, either a catalog Model Release, an embedding model identity, a Jev model version, a processor's own model id, or ponder() model coordinates.",
        "discriminator": {
          "mapping": {
            "EMBED_MODEL": "#/components/schemas/EmbedModelChoice",
            "JEV_MODEL": "#/components/schemas/JevModelChoice",
            "MODEL_RELEASE": "#/components/schemas/ModelReleaseChoice",
            "PONDER_MODEL": "#/components/schemas/PonderModelChoice",
            "PROCESSOR_MODEL": "#/components/schemas/ProcessorModelChoice"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ModelReleaseChoice"
          },
          {
            "$ref": "#/components/schemas/EmbedModelChoice"
          },
          {
            "$ref": "#/components/schemas/JevModelChoice"
          },
          {
            "$ref": "#/components/schemas/ProcessorModelChoice"
          },
          {
            "$ref": "#/components/schemas/PonderModelChoice"
          }
        ]
      },
      "ModelChoiceKind": {
        "description": "Which member of ModelChoice a value is.",
        "enum": [
          "MODEL_RELEASE",
          "EMBED_MODEL",
          "JEV_MODEL",
          "PROCESSOR_MODEL",
          "PONDER_MODEL"
        ],
        "type": "string"
      },
      "ModelChoiceSource": {
        "description": "Where a resolved model came from. The members are in precedence order.",
        "enum": [
          "EXPLICIT",
          "REQUEST_OPTION",
          "WORKSPACE_DEFAULT",
          "PLATFORM_DEFAULT"
        ],
        "type": "string"
      },
      "ModelExecutionComponent": {
        "properties": {
          "modelReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/ModelExecutionComponentRoleEnum"
          },
          "routeBindingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "role",
          "modelReleaseId",
          "routeBindingId"
        ],
        "type": "object"
      },
      "ModelExecutionComponentRoleEnum": {
        "enum": [
          "primary",
          "dictation",
          "voice"
        ],
        "type": "string"
      },
      "ModelExecutionTarget": {
        "description": "Resolved single-model, multi-model pipeline, harness-runtime, or model-route execution target.",
        "discriminator": {
          "mapping": {
            "direct_model": "#/components/schemas/DirectModelExecutionTarget",
            "direct_model_pipeline": "#/components/schemas/DirectModelPipelineExecutionTarget",
            "harness_runtime": "#/components/schemas/HarnessRuntimeExecutionTarget",
            "model_route": "#/components/schemas/ModelRouteExecutionTarget"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/DirectModelExecutionTarget"
          },
          {
            "$ref": "#/components/schemas/DirectModelPipelineExecutionTarget"
          },
          {
            "$ref": "#/components/schemas/HarnessRuntimeExecutionTarget"
          },
          {
            "$ref": "#/components/schemas/ModelRouteExecutionTarget"
          }
        ]
      },
      "ModelExecutionTargetKindEnum": {
        "enum": [
          "direct_model",
          "direct_model_pipeline",
          "harness_runtime",
          "model_route"
        ],
        "type": "string"
      },
      "ModelExecutionTargetSnapshot": {
        "properties": {
          "configurationDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "resolvedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "target": {
            "$ref": "#/components/schemas/ModelExecutionTarget"
          }
        },
        "required": [
          "target",
          "resolvedAt",
          "configurationDigest"
        ],
        "type": "object"
      },
      "ModelPolicyRefusal": {
        "description": "Why a model call fails closed. A call never falls back to another processor.",
        "enum": [
          "ENVIRONMENT_POLICY_MISSING",
          "NO_ELIGIBLE_PROCESSOR",
          "NO_MODEL",
          "PROCESSOR_NOT_ELIGIBLE",
          "MODEL_NOT_ROUTABLE"
        ],
        "type": "string"
      },
      "ModelPreferencesPreview": {
        "description": "What setModelPreferences would do with the same input, computed by web-api\nand stored nowhere (PARABLE-4676). The Workspace AI processors page shows\nit before an administrator saves.",
        "properties": {
          "changes": {
            "description": "Each capability whose availability or default model the write changes,\nin capability order. Empty when the write changes nothing a call sees.",
            "items": {
              "$ref": "#/components/schemas/ModelCapabilityChange"
            },
            "type": "array"
          },
          "proposed": {
            "$ref": "#/components/schemas/WorkspaceModelPolicy",
            "description": "The Workspace's policy as it would read after the write."
          }
        },
        "required": [
          "proposed",
          "changes"
        ],
        "type": "object"
      },
      "ModelProcessor": {
        "description": "An AI processor that may receive a Workspace's data when Parable runs a\nmodel over it (PARABLE-4494). The Workspace model policy is a set of these:\nstaff set the ceiling, the Workspace may narrow it, and the environment\npolicy caps both.",
        "enum": [
          "VERTEX",
          "OPENROUTER_ZDR",
          "ANTHROPIC",
          "TYPESAFE"
        ],
        "type": "string"
      },
      "ModelProcessorRetentionBasis": {
        "description": "On what basis a processor keeps, or does not keep, the Workspace data it receives.",
        "enum": [
          "ZERO_DATA_RETENTION_REQUIRED",
          "SERVICE_TERMS",
          "NO_ZERO_DATA_RETENTION_AGREEMENT"
        ],
        "type": "string"
      },
      "ModelProcessorTerms": {
        "additionalProperties": false,
        "description": "What one AI processor is and the terms under which it receives a\nWorkspace's data (PARABLE-4676). The Workspace AI processors page shows it,\nand it is the one source for the AI entries of the sub-processor list\n(PARABLE-4562).",
        "properties": {
          "description": {
            "description": "What the processor is and how Parable reaches it.",
            "type": "string"
          },
          "name": {
            "description": "The processor's name, as a Workspace administrator reads it. The text\nfields are plain strings: deploy.values.ts authors them with `satisfies`,\nwhich a Validate mark would refuse.",
            "type": "string"
          },
          "processor": {
            "$ref": "#/components/schemas/ModelProcessor"
          },
          "retention": {
            "description": "The retention terms that apply to the Workspace data it receives.",
            "type": "string"
          },
          "retentionBasis": {
            "$ref": "#/components/schemas/ModelProcessorRetentionBasis"
          }
        },
        "required": [
          "processor",
          "name",
          "description",
          "retention",
          "retentionBasis"
        ],
        "type": "object"
      },
      "ModelReleaseChoice": {
        "additionalProperties": false,
        "description": "A Model Release from the global catalog, for chat.",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ModelChoiceKind"
          },
          "modelReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "modelReleaseId"
        ],
        "type": "object"
      },
      "ModelRouteExecutionTarget": {
        "description": "The model a Run executes, as the person picked it (PARABLE-6164). The full\nroute web-api resolved, with its server and processor, is kept on the Run\nrow (`modelRoute`), not here, so this browser-visible target names only the\nmodel.",
        "properties": {
          "effort": {
            "description": "The effort level the person picked; null for Default.",
            "nullable": true,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ModelExecutionTargetKindEnum"
          },
          "model": {
            "description": "The models.dev key the person picked, or `parable/ponder`.",
            "type": "string"
          },
          "servedModel": {
            "description": "The models.dev key of the model that answers; for Ponder, its effort level's model.",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "model",
          "servedModel"
        ],
        "type": "object"
      },
      "MutatePersonPetInput": {
        "properties": {
          "expectedRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "MyInviteCodeView": {
        "description": "One invite code the signed-in person sent (PARABLE-4348). Shown by its first\nfour characters; who redeemed it is not shown.",
        "properties": {
          "codePrefix": {
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "redeemedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "sentToEmail": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/InviteCodeStatus"
          }
        },
        "required": [
          "id",
          "codePrefix",
          "status",
          "createdAt",
          "expiresAt"
        ],
        "type": "object"
      },
      "MyInvitesView": {
        "description": "The signed-in person's invites: how many they have left and the codes they\nsent, newest first. Parable staff are unlimited.",
        "properties": {
          "codes": {
            "items": {
              "$ref": "#/components/schemas/MyInviteCodeView"
            },
            "type": "array"
          },
          "granted": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "remaining": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "unlimited": {
            "type": "boolean"
          }
        },
        "required": [
          "unlimited",
          "granted",
          "remaining",
          "codes"
        ],
        "type": "object"
      },
      "MyWorkspaceApiTokens": {
        "description": "The caller's personal access tokens in the selected Workspace, and the rules\na new one follows.",
        "properties": {
          "apiTokensEnabled": {
            "description": "False when the Workspace has turned personal access tokens off: every\ntoken is refused and no new one can be created.",
            "type": "boolean"
          },
          "defaultExpiresInDays": {
            "description": "The expiry a new token gets when the request names none.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "items": {
            "description": "Newest first, revoked and expired tokens included.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceApiToken"
            },
            "type": "array"
          },
          "maxExpiresInDays": {
            "description": "The longest expiry a new token may have.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "apiTokensEnabled",
          "defaultExpiresInDays",
          "maxExpiresInDays"
        ],
        "type": "object"
      },
      "NewMessageParableProblemRunTriggerInput": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemRunTriggerKindEnum"
          },
          "message": {
            "$ref": "#/components/schemas/NewParableProblemMessageInput"
          }
        },
        "required": [
          "kind",
          "message"
        ],
        "type": "object"
      },
      "NewParablePossibilityArgumentInput": {
        "properties": {
          "body": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "order": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "polarity": {
            "$ref": "#/components/schemas/PossibilityArgumentPolarityEnum"
          }
        },
        "required": [
          "polarity",
          "body",
          "order"
        ],
        "type": "object"
      },
      "NewParableProblemContextInput": {
        "description": "Server-validated exact Parable, revision, version, Proposal, or Piece context attachment.",
        "discriminator": {
          "mapping": {
            "parable": "#/components/schemas/NewParableProblemParableContextInput",
            "piece": "#/components/schemas/NewParableProblemPieceContextInput",
            "proposal": "#/components/schemas/NewParableProblemProposalContextInput",
            "revision": "#/components/schemas/NewParableProblemRevisionContextInput",
            "version": "#/components/schemas/NewParableProblemVersionContextInput"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/NewParableProblemParableContextInput"
          },
          {
            "$ref": "#/components/schemas/NewParableProblemRevisionContextInput"
          },
          {
            "$ref": "#/components/schemas/NewParableProblemVersionContextInput"
          },
          {
            "$ref": "#/components/schemas/NewParableProblemProposalContextInput"
          },
          {
            "$ref": "#/components/schemas/NewParableProblemPieceContextInput"
          }
        ]
      },
      "NewParableProblemMessageInput": {
        "description": "Browser-authored message. Server fixes role, status, author, time, and observed revision.",
        "properties": {
          "audience": {
            "items": {
              "$ref": "#/components/schemas/ParableActorAssignment"
            },
            "maxItems": 100,
            "nullable": true,
            "type": "array"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "mentionPlans": {
            "description": "One confirmation proof for every mention. The server consumes these plans,\napplies access/publication changes, creates Pings, notifications, and\nmention rows, and commits the Message in one transaction or does nothing.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemMentionPlanConsumptionInput"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "mentions": {
            "description": "Typed attention targets; Message visibility still follows the Problem.",
            "items": {
              "$ref": "#/components/schemas/ParableActorRef"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "parts": {
            "items": {
              "$ref": "#/components/schemas/ParableAuthoredProblemMessagePart"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array"
          },
          "regarding": {
            "items": {
              "$ref": "#/components/schemas/ParableMessageRegarding"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "parts",
          "mentions",
          "mentionPlans",
          "regarding",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "NewParableProblemParableContextInput": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemContextKindEnum"
          },
          "observedRevision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          }
        },
        "required": [
          "kind",
          "observedRevision"
        ],
        "type": "object"
      },
      "NewParableProblemPieceContextInput": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemContextKindEnum"
          },
          "observedRevision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "pieceRef": {
            "$ref": "#/components/schemas/ParablePieceRevisionRef"
          },
          "proposalRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "observedRevision",
          "rootRefId",
          "pieceRef"
        ],
        "type": "object"
      },
      "NewParableProblemProofInput": {
        "description": "Browser-authored closed proof definition; server owns identity, Problem binding, revision pins, and Ponder model provenance.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/NewPictureProblemProofInput"
          },
          {
            "$ref": "#/components/schemas/NewPeopleProblemProofInput"
          },
          {
            "$ref": "#/components/schemas/NewPonderProblemProofInput"
          },
          {
            "$ref": "#/components/schemas/NewPlotProblemProofInput"
          }
        ]
      },
      "NewParableProblemProposalContextInput": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemContextKindEnum"
          },
          "observedRevision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "proposalRef": {
            "$ref": "#/components/schemas/ParableProposalRef"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "observedRevision",
          "rootRefId",
          "proposalRef"
        ],
        "type": "object"
      },
      "NewParableProblemRevisionContextInput": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemContextKindEnum"
          },
          "observedRevision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "observedRevision",
          "rootRefId"
        ],
        "type": "object"
      },
      "NewParableProblemVersionContextInput": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableProblemContextKindEnum"
          },
          "observedRevision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "versionRef": {
            "$ref": "#/components/schemas/ParableVersionRef"
          }
        },
        "required": [
          "kind",
          "observedRevision",
          "rootRefId",
          "versionRef"
        ],
        "type": "object"
      },
      "NewPeopleProblemProofInput": {
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemProofKindEnum"
          },
          "name": {
            "type": "string"
          },
          "reviewerRefs": {
            "items": {
              "$ref": "#/components/schemas/ParableActorRef"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "name",
          "handle",
          "kind",
          "reviewerRefs"
        ],
        "type": "object"
      },
      "NewPictureProblemProofInput": {
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemProofKindEnum"
          },
          "name": {
            "type": "string"
          },
          "screenshots": {
            "items": {
              "description": "Image metadata",
              "type": "object"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "name",
          "handle",
          "kind",
          "screenshots"
        ],
        "type": "object"
      },
      "NewPingPossibilityInput": {
        "description": "One offered answer, created in the same call as the question that offers it.\nA Possibility may also be added to an open question later, which is how a\nperson contributes an option the asker did not think of.",
        "properties": {
          "arguments": {
            "items": {
              "$ref": "#/components/schemas/NewParablePossibilityArgumentInput"
            },
            "maxItems": 100,
            "type": "array"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "responsibilities": {
            "items": {
              "$ref": "#/components/schemas/ParableActorAssignment"
            },
            "maxItems": 100,
            "type": "array"
          },
          "summary": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "name",
          "handle",
          "summary",
          "arguments",
          "responsibilities"
        ],
        "type": "object"
      },
      "NewPlotProblemProofInput": {
        "properties": {
          "assertion": {
            "description": "SQL text",
            "maxLength": 65536,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemProofKindEnum"
          },
          "name": {
            "type": "string"
          },
          "plotPieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "name",
          "handle",
          "kind",
          "plotPieceId",
          "assertion"
        ],
        "type": "object"
      },
      "NewPonderProblemProofInput": {
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemProofKindEnum"
          },
          "name": {
            "type": "string"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "name",
          "handle",
          "kind",
          "runId"
        ],
        "type": "object"
      },
      "NoFutureTimestampRule": {
        "properties": {
          "maxViolations": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "maxViolations"
        ],
        "type": "object"
      },
      "NullRateRule": {
        "properties": {
          "maxRate": {
            "format": "double",
            "type": "number"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "maxRate"
        ],
        "type": "object"
      },
      "OAuth2AuthConfig": {
        "description": "Configuration for OAuth 2.0 authentication flows.",
        "properties": {
          "audienceParam": {
            "description": "Audience parameter (for APIs that require it)",
            "nullable": true,
            "type": "string"
          },
          "authorizeUrl": {
            "description": "Authorization URL (for authorization code flow)",
            "format": "uri",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "grantType": {
            "description": "OAuth2 grant type (e.g. client_credentials, account_credentials)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/OAuthGrantType"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "passwordField": {
            "description": "Credential field name for password (basic_credentials auth method)",
            "nullable": true,
            "type": "string"
          },
          "platformManagedClient": {
            "description": "Whether Parable owns the OAuth client and supplies its credentials at runtime.",
            "nullable": true,
            "type": "boolean"
          },
          "resourceHeaders": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Maps resource request header names to credential field names.",
            "nullable": true,
            "type": "object"
          },
          "scopes": {
            "description": "OAuth scopes for the token request (space-joined in the token POST body per RFC 6749)",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "tokenBodyEncoding": {
            "description": "Token request body encoding (form by default).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/BodyEncodingEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "tokenEndpoint": {
            "description": "Token endpoint URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "tokenEndpointAuthMethod": {
            "description": "How credentials are sent to the token endpoint",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TokenEndpointAuthMethod"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "tokenEndpointExtraParams": {
            "description": "Maps token request param names to credential field names",
            "nullable": true
          },
          "tokenPrefix": {
            "description": "Authorization header prefix (default: Bearer)",
            "nullable": true,
            "type": "string"
          },
          "tokenReadinessDelaySeconds": {
            "description": "Delay between token issuance and the first request that uses the token.",
            "format": "int64",
            "maximum": 10,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "tokenRefreshCodes": {
            "description": "HTTP failure status codes on API responses that trigger an OAuth2 access-token\nrefresh and a single retry of the same request (client-credentials flow).\nWhen this field is omitted, ingestion defaults to HTTP 401 as the only\nrefresh trigger (equivalent to a list containing 401), so long paginated\nsyncs can recover after token TTL (for example Microsoft Graph).\nPass an explicit empty list to disable HTTP-triggered refresh; proactive\nrefresh near local token expiry may still apply.",
            "items": {
              "format": "double",
              "maximum": 599,
              "minimum": 400,
              "type": "number"
            },
            "nullable": true,
            "type": "array"
          },
          "tokenResponsePath": {
            "description": "Dot-separated path to token in response JSON (default: access_token)",
            "nullable": true,
            "type": "string"
          },
          "usernameField": {
            "description": "Credential field name for username (basic_credentials auth method)",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "tokenEndpoint"
        ],
        "type": "object"
      },
      "OAuthGrantType": {
        "description": "OAuth 2.0 grant type for token requests.",
        "enum": [
          "client_credentials",
          "authorization_code",
          "refresh_token",
          "account_credentials"
        ],
        "type": "string"
      },
      "OAuthLoginInput": {
        "properties": {
          "idToken": {
            "description": "Providers ID token",
            "type": "string"
          },
          "nonce": {
            "description": "Nonce",
            "type": "string"
          },
          "provider": {
            "$ref": "#/components/schemas/OAuthProviderEnum",
            "description": "OAuth provider identifier (e.g., \"google\")"
          }
        },
        "required": [
          "idToken",
          "provider",
          "nonce"
        ],
        "type": "object"
      },
      "OAuthProviderEnum": {
        "description": "OAuth providers that are enabled for user Login to Parable",
        "enum": [
          "google"
        ],
        "type": "string"
      },
      "OAuthSignupStartInput": {
        "description": "Input to start a self-serve OAuth signup. Same id-token + nonce shape as\nOAuthLoginInput so the FE can reuse one OAuth callback path and only switch\nwhich mutation it posts to based on intent.",
        "properties": {
          "idToken": {
            "description": "OAuth provider id token (Google id_token today).",
            "type": "string"
          },
          "nonce": {
            "description": "Nonce echoed back by the provider. Same constant-time compare semantics\nas OAuthLoginInput.nonce.",
            "type": "string"
          },
          "provider": {
            "$ref": "#/components/schemas/OAuthProviderEnum",
            "description": "OAuth provider identifier. Currently only `google` is accepted; the server\nrejects everything else with INVALID_PROVIDER."
          },
          "returnTo": {
            "description": "Optional post-auth landing URL. Same shape, contract, and validator as\nSignupTenantInput.returnTo. Persisted on the oauth_signup_session row;\nsurfaced as AuthPayload.redirectTo when oauthSignupComplete mints the\nsession. Ignored (rejected via validateReturnTo) when the existing-user\nbranch fires, because the redirectTo for that branch is the tenant home.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "idToken",
          "provider",
          "nonce"
        ],
        "type": "object"
      },
      "OffsetPaginationConfig": {
        "description": "Configuration for offset-based pagination.",
        "properties": {
          "defaultLimit": {
            "description": "Default page size",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "initialOffset": {
            "description": "First offset sent to the Provider (default: 0)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "limitParam": {
            "description": "Query parameter name for limit (default: 'limit')",
            "nullable": true,
            "type": "string"
          },
          "maxLimit": {
            "description": "Maximum page size allowed by API",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "nextPageLinkPath": {
            "description": "When set, offset pagination mirrors TestRail-style responses: continue only\nwhile this path is non-null (e.g. `_links.next`), and advance offset by\n`defaultLimit` per page instead of the returned record count.",
            "nullable": true,
            "type": "string"
          },
          "offsetParam": {
            "description": "Query parameter name for offset (default: 'offset')",
            "nullable": true,
            "type": "string"
          },
          "totalPath": {
            "description": "JMESPath to extract total count",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "defaultLimit"
        ],
        "type": "object"
      },
      "OidcConnectionReadback": {
        "description": "OIDC connection projection read back from Stytch. The client secret is\nwrite-only and is never echoed here.",
        "properties": {
          "clientId": {
            "type": "string"
          },
          "connectionId": {
            "type": "string"
          },
          "displayName": {
            "nullable": true,
            "type": "string"
          },
          "issuerUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "redirectUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "required": [
          "connectionId",
          "issuerUrl",
          "clientId",
          "redirectUrl"
        ],
        "type": "object"
      },
      "OrganizationOverviewRollupRow": {
        "description": "One leaf group of the Organization Overview preview: the hierarchy values\nfrom the top of the tree down (division, department, team) and the active\nheadcount summed for that group. The panel folds these rows into its tree.",
        "properties": {
          "headcount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "values": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "values",
          "headcount"
        ],
        "type": "object"
      },
      "OrganizationSize": {
        "description": "=====================================================\nSignup Profile Enums\n=====================================================\nCaptured on the self-serve signup form for cohort analytics. Each bucket\nis closed and curated by the marketing team; widen by adding a value here\nand letting psgen regenerate the validator. The labels intentionally match\nthe option strings the FE sends so the BFF can forward them verbatim.\nHeadcount bucket of the signing-up organization.",
        "enum": [
          "SIZE_1_50",
          "SIZE_51_250",
          "SIZE_251_1000",
          "SIZE_1001_5000",
          "SIZE_5001_20000",
          "SIZE_20000_PLUS"
        ],
        "type": "string"
      },
      "PageNumberPaginationConfig": {
        "description": "Configuration for page number pagination.",
        "properties": {
          "defaultPageSize": {
            "description": "Default page size",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "pageParam": {
            "description": "Query parameter name for page (default: 'page')",
            "nullable": true,
            "type": "string"
          },
          "pageSizeParam": {
            "description": "Query parameter name for page size (default: 'per_page')",
            "nullable": true,
            "type": "string"
          },
          "paramLocation": {
            "description": "Where page/pageSize travel for POST endpoints (body or query).",
            "nullable": true,
            "type": "string"
          },
          "totalPagesPath": {
            "description": "JMESPath to extract total pages",
            "nullable": true,
            "type": "string"
          },
          "totalPath": {
            "description": "JMESPath to the total record count. Paging stops once the pages read\ncover it, so a Provider that rejects a page past the end is not asked\nfor one.",
            "nullable": true,
            "type": "string"
          },
          "zeroBased": {
            "description": "Whether pages are numbered from 0 instead of 1 (default: false).\nDatadog numbers page[number] from 0. A boolean, because generated Go\ndrops an integer 0 (psgen: optional integers are value types).",
            "nullable": true,
            "type": "boolean"
          }
        },
        "required": [
          "defaultPageSize"
        ],
        "type": "object"
      },
      "PaginationConfig": {
        "description": "=============================================================================\nPagination\n=============================================================================\nPagination configuration for a tap endpoint.",
        "properties": {
          "cursor": {
            "description": "Cursor pagination settings (when type = CURSOR)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/CursorPaginationConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "offset": {
            "description": "Offset pagination settings (when type = OFFSET)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/OffsetPaginationConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "pageNumber": {
            "description": "Page number pagination settings (when type = PAGE_NUMBER)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PageNumberPaginationConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "sessionPage": {
            "description": "Session + page pagination settings (when type = SESSION_PAGE)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SessionPagePaginationConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "type": {
            "$ref": "#/components/schemas/PaginationTypeEnum",
            "description": "Pagination strategy type"
          }
        },
        "required": [
          "type"
        ],
        "type": "object"
      },
      "PaginationTypeEnum": {
        "description": "Pagination strategy for API endpoints.",
        "enum": [
          "link_header",
          "cursor",
          "offset",
          "page_number",
          "session_page",
          "none"
        ],
        "type": "string"
      },
      "PaneRelationSchema": {
        "description": "A Pane's values as a relation a Plot reads by name,\n`parables.\u003cparable\u003e.\u003cpane\u003e`: one row, one column per field of the Pane's\ncompiled `preferences` (PARABLE-5675). Planning and R8 receive the schema so\na Plot that reads a Pane types at save with nothing bound; a read or a run\nreceives it with the row (`PaneRelationValues`).",
        "properties": {
          "paneKey": {
            "description": "The Pane's permanent identity; references are stored by it.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "paneSlug": {
            "description": "The Pane's handle in catalog form: the relation's name. Panes and Plots\nshare one handle namespace per Parable, so it never names a Plot.",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "parableSlug": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "schema": {
            "description": "One column per field of the Pane's compiled `preferences`.",
            "type": "object"
          }
        },
        "required": [
          "paneKey",
          "parableSlug",
          "paneSlug",
          "schema"
        ],
        "type": "object"
      },
      "PaneRelationValues": {
        "description": "One referenced Pane's values for one read or one run: its relation and the\nsingle row the Query Layer binds as an in-memory table. web-api resolves the\nrow (the reader's on-screen value, else saved Me, else This Parable, else the\nPlot's default by name; or This Parable for a scheduled, materialized or\nReport run), checks it against the Pane's `preferences`, and lists the Pane\nonly when the reader or run may view its Preferences.",
        "properties": {
          "relation": {
            "$ref": "#/components/schemas/PaneRelationSchema"
          },
          "row": {
            "description": "The row: each field's value by field name, as `preferences` types it."
          }
        },
        "required": [
          "relation",
          "row"
        ],
        "type": "object"
      },
      "Parable": {
        "description": "Parable API Response Types\nA Parable with all its milestones and the current tenant's milestone states. State is computed from TenantConnector records at query time.",
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "milestones": {
            "items": {
              "$ref": "#/components/schemas/ParableMilestone"
            },
            "type": "array"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "requiredConnectedCount": {
            "description": "Number of required milestones currently ENABLED for this tenant",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "requiredTotalCount": {
            "description": "Total number of required milestones",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "slug": {
            "description": "Immutable URL-friendly identifier. Assigned at creation, never changes. Used for stable API endpoints. Internal only, not displayed to users.",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "slug",
          "name",
          "milestones",
          "requiredConnectedCount",
          "requiredTotalCount"
        ],
        "type": "object"
      },
      "ParableActionSurfaceEnum": {
        "description": "Which surface may run a ProductParableAction.\nBOTH is the common case. ADMIN is what makes Deploy the one capability a\nWorkspace can never hold: Deploy decides which organizations hold a Parable,\nso there is no single Deployment to hang RACI on and the surface itself is the\ngate. Revoke and Retract are ADMIN for the same reason -- they are Deploy's\ninverses, and an inverse that a Workspace could reach would let a Workspace\nundo an act it could not perform.",
        "enum": [
          "admin",
          "workspace",
          "both"
        ],
        "type": "string"
      },
      "ParableActionTargetEnum": {
        "description": "What a ProductParableAction acts on.\nThis is the field `axis` was derivable from. Reach actions target a\nDeployment, a Delivery or a Rollout; authoring actions target a Proposal, a\nPatch or a Piece. Keeping the target and dropping the axis leaves one\nstatement of that fact instead of two that can disagree.",
        "enum": [
          "proposal",
          "patch",
          "piece",
          "deployment",
          "delivery",
          "rollout",
          "productParable"
        ],
        "type": "string"
      },
      "ParableActorAssignment": {
        "properties": {
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "role": {
            "$ref": "#/components/schemas/ParableRaciRoleEnum"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableActorSelectionScopeEnum"
          }
        },
        "required": [
          "actorRef",
          "role",
          "scope"
        ],
        "type": "object"
      },
      "ParableActorKindEnum": {
        "description": "The Parable actor kind tree (PARABLE-1585, decision PD5).\nPerson          collective = false\nAgent           collective = false\nOrganization    collective = true\nParable Platform\nParable Workspace\nRole            (added 2026-09-04, reversing the PD5 removal below)\n`collective` and the parent edge are not expressible here -- a TypeScript enum\nis flat -- so they live in the `parable_actor_kind` table, which this enum must\nstay in step with. Three values were removed rather than left storable:\nrole      Removed by PD5 as \"a permission grant, not something that acts\",\non the argument that a role holding Accountable leaves no single\napprover to name. Reinstated on 2026-09-04: a Role is the group\na Workspace already maintains for \"who may do this\", and seating\nit is what removes the system-account Primary the example\nParable needed. Several people being accountable through a\ngroup is accepted. Resolves through tenant_user_role inside a\nWorkspace and staff_user_role on the apex.\nprovider  A connector-catalog row from a different product.\nteam      PD5 decided Team is not a v1 actor kind. There is no team source\nbranch and no team table, so no team actor could ever exist, and a\nstorable kind that cannot resolve is an authorization hole rather\nthan a placeholder. Team-owned Proposals are out of v1.\nThis enum is the source the CHECK constraint on\n`parable_raci.actor_kind` mirrors by hand -- psgen emits no CHECK\nconstraints. `TestParableActorKind_CheckConstraintMatchesEnum` in\nservices/web-db/migrations fails the moment the two diverge, and\n`parable_actor_kind_drift()` covers the CHECK against the kind tree.",
        "enum": [
          "organization",
          "person",
          "agent",
          "platform",
          "workspace",
          "role"
        ],
        "type": "string"
      },
      "ParableActorRef": {
        "description": "Authoritative Actor identity accepted by writes.",
        "properties": {
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableActorKindEnum"
          }
        },
        "required": [
          "kind",
          "id"
        ],
        "type": "object"
      },
      "ParableActorSelectionScopeEnum": {
        "description": "The SELF key is deliberately not the enum member name: PascalCasing SELF\nproduces `Self`, which collides with Rust's reserved Self type keyword and\nfails codegen. SELF_SCOPE keeps the wire value 'self' unchanged.",
        "enum": [
          "self",
          "self_and_descendants"
        ],
        "type": "string"
      },
      "ParableActorSnapshotView": {
        "properties": {
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableActorKindEnum"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "kind"
        ],
        "type": "object"
      },
      "ParableArchiveChangeKindEnum": {
        "description": "What one change in an import plan touches: a Piece, or one of the\nParable-scoped rows an archive carries beside its Pieces.",
        "enum": [
          "page",
          "package",
          "pane",
          "plot",
          "palette",
          "report",
          "report_plan"
        ],
        "type": "string"
      },
      "ParableArchiveImportActionEnum": {
        "enum": [
          "create",
          "update",
          "move",
          "rename",
          "delete"
        ],
        "type": "string"
      },
      "ParableArchiveImportDiagnosticSeverityEnum": {
        "enum": [
          "error",
          "warning"
        ],
        "type": "string"
      },
      "ParableAuthoredProblemMessagePart": {
        "description": "Browser-authored Problem message content; server fixes author, role, status, and provenance.",
        "discriminator": {
          "mapping": {
            "attachment": "#/components/schemas/MessageAttachmentPart",
            "source": "#/components/schemas/MessageSourcePart",
            "text": "#/components/schemas/MessageTextPart"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/MessageTextPart"
          },
          {
            "$ref": "#/components/schemas/MessageSourcePart"
          },
          {
            "$ref": "#/components/schemas/MessageAttachmentPart"
          }
        ]
      },
      "ParableAuthoringCapabilitiesView": {
        "properties": {
          "actions": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableLifecycleActionCapabilitiesView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "canArchive": {
            "type": "boolean"
          },
          "canCreateProposal": {
            "type": "boolean"
          },
          "canEdit": {
            "type": "boolean"
          },
          "canPrepare": {
            "type": "boolean"
          },
          "canPropose": {
            "type": "boolean"
          },
          "canPublish": {
            "type": "boolean"
          },
          "canPull": {
            "type": "boolean"
          },
          "canReadCatalogSnapshot": {
            "description": "Whether this reader may fetch the Plot editor's catalog snapshot -- the one\nprojection of everything the SQL can see (PARABLE-2703, spec 0084 \"Surfaces\n-- Editor\").\nIT IS NOT ONE OF THE VERBS ABOVE, and it is the only field here that is not\na RACI answer. The others ask what this actor's seat allows on this\nParable; this one asks whether they hold one permission leaf,\n`tenant.data.catalog`, which the Workspace grants across the whole data\nsurface and which the Parable's RACI table has no opinion about. It is\ncarried here anyway because this view IS the payload the editor already\nloads: the alternative is a second fetch on every Plot open, purely to\nlearn whether a third fetch will 403.\nFalse means SQL validation is unavailable, NOT that the Plot is read-only.\nThe editor keeps editing and saving enabled and shows why validation is\noff; the route itself answers PA-AU-031 for the same reader.",
            "type": "boolean"
          },
          "canReplaceRaci": {
            "type": "boolean"
          },
          "canRestore": {
            "type": "boolean"
          },
          "canWorkspacePublish": {
            "type": "boolean"
          }
        },
        "required": [
          "canEdit",
          "canCreateProposal",
          "canPropose",
          "canPrepare",
          "canArchive",
          "canRestore",
          "canReplaceRaci",
          "canPublish",
          "canPull",
          "canWorkspacePublish",
          "canReadCatalogSnapshot"
        ],
        "type": "object"
      },
      "ParableAuthoringModeEnum": {
        "enum": [
          "composed",
          "custom"
        ],
        "type": "string"
      },
      "ParableChangeItemView": {
        "properties": {
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "entityKind": {
            "$ref": "#/components/schemas/ParableEntityKindEnum"
          },
          "operation": {
            "$ref": "#/components/schemas/ParablePatchOperationEnum"
          }
        },
        "required": [
          "entityKind",
          "entityKey",
          "operation"
        ],
        "type": "object"
      },
      "ParableCollaborationModeEnum": {
        "description": "Whether this Parable line is edited directly or through published Versions.",
        "enum": [
          "personal",
          "published_versions"
        ],
        "type": "string"
      },
      "ParableCommandErrorCodeEnum": {
        "description": "The family a refused Parable authoring command records on its receipt. A\nreplay of the same idempotency key answers with the status and authoring\nerror code of its recorded family, so a family whose name matches a\nParableAuthoringError member replays as that code. The classifier is\ncommandRefusalFamilies in services/pkg/parable/command.go.\n\nINVALID_TRANSITION, STALE_INPUT and PERMISSION_DENIED are coarse: several\nrefusals share each, and a replay answers PA-AU-005, PA-AU-003 or PA-AU-019.\nINTERNAL is every refusal no family names, and replays as PA-AU-009.\n\nA receipt keeps the family it recorded. When a refusal moves from a coarse\nfamily to its own, receipts written before the move still replay as the\ncoarse code.",
        "enum": [
          "idempotency_key_reused",
          "permission_denied",
          "stale_input",
          "invalid_transition",
          "custom_lifecycle_forbidden",
          "not_your_draft",
          "collective_author",
          "prepare_required",
          "resolution_stale",
          "plot_gate_blocked",
          "stale_review",
          "delivery_in_review",
          "delivery_terminal",
          "primary_archived",
          "schema_upgrade_required",
          "not_found",
          "invalid_deployment_targets",
          "workspace_handle_taken",
          "slug_taken",
          "admin_handle_taken",
          "sealed_source",
          "proposal_conflicted",
          "source_conflict",
          "nothing_to_propose",
          "internal"
        ],
        "type": "string"
      },
      "ParableCommandKindEnum": {
        "description": "Every command the Parable ledger can record, one member per command.\n# AUTOSAVE_PROPOSAL and AUTOSAVE_PRIMARY were here, and they are GONE\nPARABLE-3247. The authoring save is not a command in this ledger's sense and\nnever was: nothing ever wrote either member -- no route, no Store method, no\nworker, in any environment.\nThey are DELETED rather than kept as historical, and that distinction is the\none this file turns on. SET_PROGRESS, SET_VISIBILITY and DISCARD_PROPOSAL stay\nbecause durable receipt rows written before their routes were deleted still\nname them, and the generated Go enum refuses a row it cannot spell. There is\nno such row for the autosave pair, so there was nothing to keep them for, and\na member kept without that reason is speculation the next reader has to\ndisprove.\nWhy the save mints no receipt, so this is not re-litigated: it is CAS-guarded\nby expectedRefVersion and expectedAggregateRevision, so a repeat is refused by\nthe token it carries rather than by an idempotency key -- the same reasoning\nalready written down for SetWorkspaceParableIdentity and\nSetWorkspaceParableClassification. Save refusals travel on\nParableAuthoringError, a different enum from ParableCommandErrorCodeEnum. And\na receipt row is permanently undeletable (trg_parable_command_receipt_durable)\nwith no prune, no partitioning and no retention policy, which is the wrong\nsubstrate for a 500ms-debounced write whose every other trace is already\nretained under `@versioned` retentionDays.",
        "enum": [
          "create_independent_primary",
          "create_proposal",
          "set_progress",
          "set_visibility",
          "propose_proposal",
          "patch_proposal",
          "prepare_proposal",
          "archive_proposal",
          "restore_proposal",
          "discard_proposal",
          "delete_proposal",
          "admin_publish",
          "pull_delivery",
          "retry_delivery",
          "workspace_publish",
          "revoke_deployment",
          "retract_commit",
          "deploy_rollout",
          "revalidate_primary",
          "revalidate_proposal",
          "archive_primary",
          "restore_primary",
          "delete_primary"
        ],
        "type": "string"
      },
      "ParableCommandReceiptView": {
        "properties": {
          "attemptCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "command": {
            "$ref": "#/components/schemas/ParableCommandKindEnum",
            "description": "psgen resolves enum imports in the consuming API service. The shared base\nowns every scalar field; only these closed fields stay local."
          },
          "completedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "correlationId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "errorCode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableCommandErrorCodeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "failedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resultHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "resultId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resultRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ParableCommandStatusEnum"
          }
        },
        "required": [
          "id",
          "correlationId",
          "attemptCount",
          "createdAt",
          "command",
          "status"
        ],
        "type": "object"
      },
      "ParableCommandReceiptViewBase": {
        "properties": {
          "attemptCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "completedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "correlationId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "failedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resultHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "resultId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resultRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "correlationId",
          "attemptCount",
          "createdAt"
        ],
        "type": "object"
      },
      "ParableCommandStatusEnum": {
        "enum": [
          "accepted",
          "running",
          "completed",
          "failed"
        ],
        "type": "string"
      },
      "ParableConflictChoiceEnum": {
        "description": "Per-conflict resolution choice when publishing a Parable proposal\n(EDR-0077 merge = entity-level three-version compare). Each conflict the\nmerge surfaces must be settled with exactly one of these; the losing side\nis stash-pointed into @versioned history, never destroyed.",
        "enum": [
          "keep_mine",
          "keep_theirs"
        ],
        "type": "string"
      },
      "ParableContext": {
        "description": "Public, host-owned execution coordinates shared by React and SQL.\nRequested coordinates do not attest to returned data provenance or grant\naccess. The host resolves authority and authorizes every sensitive call.",
        "properties": {
          "actor": {
            "description": "Initiating actor, if any. Null never means an unrestricted execution.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableContextActor"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "data": {
            "$ref": "#/components/schemas/PlotDataReading"
          },
          "mode": {
            "$ref": "#/components/schemas/ParableContextMode"
          },
          "parable": {
            "$ref": "#/components/schemas/ParableContextDefinition"
          },
          "permissions": {
            "description": "Reserved empty list in every runtime. Use raci and Pane Policies for\nParable presentation; host permission grants are enforced outside context.",
            "items": {
              "description": "Hierarchical permission string (e.g., 'admin.users.read')",
              "maxLength": 255,
              "pattern": "^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9]*)*$",
              "type": "string"
            },
            "type": "array"
          },
          "principal": {
            "$ref": "#/components/schemas/ParableContextActor",
            "description": "Identity whose authority runs this operation; required even on scheduled work."
          },
          "raci": {
            "$ref": "#/components/schemas/ParableRaciRoleEnum"
          },
          "viewAs": {
            "description": "The person previewing this Parable as the principal (View as); null\notherwise. The server refuses every write while a preview runs\n(PA-AU-044), so a Pane shows read-only controls when it is set.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableContextActor"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "workspace": {
            "$ref": "#/components/schemas/ParableContextWorkspace"
          }
        },
        "required": [
          "workspace",
          "parable",
          "data",
          "principal",
          "permissions",
          "raci",
          "mode"
        ],
        "type": "object"
      },
      "ParableContextActor": {
        "description": "An identity resolved by the host; it contains no credential or session secret.",
        "properties": {
          "actorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "actorKind": {
            "$ref": "#/components/schemas/ParableActorKindEnum"
          },
          "email": {
            "description": "Authenticated account email resolved by the server, never a caller parameter or inferred identity match.",
            "format": "email",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          }
        },
        "required": [
          "actorId",
          "actorKind"
        ],
        "type": "object"
      },
      "ParableContextDefinition": {
        "properties": {
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "$ref": "#/components/schemas/ParableContextRevision"
          }
        },
        "required": [
          "parableId",
          "handle",
          "revision"
        ],
        "type": "object"
      },
      "ParableContextMode": {
        "description": "Presentation mode; this never grants a permission.",
        "enum": [
          "personal",
          "published"
        ],
        "type": "string"
      },
      "ParableContextRevision": {
        "description": "Definition identity, never the version that happened to produce a Report.\nREF requires refId and refRevision with commitId null; COMMIT requires\ncommitId with both ref fields null. Executors validate these invariants.",
        "properties": {
          "commitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableContextRevisionKind"
          },
          "refId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "ParableContextRevisionKind": {
        "description": "The definition being executed, independently of its selected data reading.",
        "enum": [
          "ref",
          "commit"
        ],
        "type": "string"
      },
      "ParableContextWorkspace": {
        "description": "Every Parable executes in a Workspace, including the Dogfood Admin workspace.",
        "properties": {
          "workspaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "workspaceId"
        ],
        "type": "object"
      },
      "ParableCustomPageProjectionSourceEnum": {
        "enum": [
          "parable_vendor",
          "parable_vendor_grouping"
        ],
        "type": "string"
      },
      "ParableDeliveryCancellationReasonEnum": {
        "enum": [
          "workspace_removed",
          "target_ineligible",
          "source_retracted"
        ],
        "type": "string"
      },
      "ParableDeliveryFailureCodeEnum": {
        "enum": [
          "target_unavailable",
          "target_ineligible",
          "source_retracted",
          "schema_epoch_incompatible",
          "compose_failed",
          "build_failed",
          "persist_failed",
          "stale_review",
          "internal"
        ],
        "type": "string"
      },
      "ParableDeliveryStatusEnum": {
        "enum": [
          "available",
          "in_review",
          "conflicted",
          "failed",
          "applied",
          "superseded",
          "cancelled"
        ],
        "type": "string"
      },
      "ParableDeliverySummaryView": {
        "properties": {
          "appliedVersionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "cancellationReason": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableDeliveryCancellationReasonEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "deliveryCorrelationId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "deliveryFromVersionIdSnapshot": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "deliveryStatus": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableDeliveryStatusEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "deliveryTargetVersionIdSnapshot": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "failureCode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableDeliveryFailureCodeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "supersededById": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "ParableDeploymentRolloutSummaryView": {
        "properties": {
          "contentChanged": {
            "type": "boolean"
          },
          "deployedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rolloutNumber": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "sourceVersionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "targetMode": {
            "$ref": "#/components/schemas/ParableWorkspaceTargetModeEnum"
          }
        },
        "required": [
          "id",
          "rolloutNumber",
          "contentChanged",
          "targetMode",
          "deployedAt",
          "sourceVersionId"
        ],
        "type": "object"
      },
      "ParableDeploymentRolloutTargetView": {
        "description": "The audience side of a Delivery row. Its source moved from\nParableDeploymentRolloutTarget to the Delivery that absorbed it\n(PARABLE-1469); the projected fields are unchanged, so the admin route and\nevery reader of it are unchanged too. It deliberately omits deliveryStatus:\nthis projection answers who the Rollout addressed, and how far the content got\nis ParableDeliverySummaryView's question.",
        "properties": {
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "selection": {
            "$ref": "#/components/schemas/ParableWorkspaceTargetSelectionEnum"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantNameSnapshot": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          }
        },
        "required": [
          "id",
          "tenantId",
          "tenantNameSnapshot",
          "selection"
        ],
        "type": "object"
      },
      "ParableDeploymentVersionSummaryView": {
        "properties": {
          "author": {
            "$ref": "#/components/schemas/ParableActorSnapshotView"
          },
          "commitId": {
            "description": "The commit IS the version now, so this is the row's own id. Kept as a\nseparate wire field so existing clients do not have to change shape in\nthis ticket.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "contentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "latest": {
            "description": "Newest published version on this line. See ParableVersionSummaryView.latest.",
            "type": "boolean"
          },
          "publishedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "publishedSequence": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "reviewedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "schemaEpoch": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "upstreamCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "versionLocal": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "versionMajor": {
            "description": "The same three integers ParableVersionSummaryView carries, and for the same\nreason: a Workspace line renders `v2.3+4` off them without arithmetic. Not\nnullable, for the same reason again -- see the block on that view.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "versionMinor": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "rootRefId",
          "versionMajor",
          "versionMinor",
          "versionLocal",
          "schemaEpoch",
          "latest",
          "commitId",
          "author"
        ],
        "type": "object"
      },
      "ParableDetails": {
        "properties": {
          "deletedOnRef": {
            "type": "boolean"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "labMode": {
            "type": "boolean"
          },
          "order": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "summary": {
            "nullable": true,
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "entityKey",
          "deletedOnRef",
          "order",
          "title",
          "tags",
          "labMode"
        ],
        "type": "object"
      },
      "ParableDiagnosticOriginEnum": {
        "description": "Which check reported one Piece diagnostic. Every diagnostic an editor draws\nor an agent reads carries one, so a reader can tell a lint finding from a\ncompile error, a type error, a Plot SQL finding, a refused save, or an error\nthe preview hit while it ran. The tool that produced it is the diagnostic's\n`source` (oxlint, typescript, esbuild, plot-validator, ...).\n\nNew checks add a member here; readers list every member they do not know\nunder its own name rather than dropping it.",
        "enum": [
          "lint",
          "typescript",
          "build",
          "sql",
          "render",
          "preview",
          "refusal"
        ],
        "type": "string"
      },
      "ParableDirectoryContextEnum": {
        "enum": [
          "admin",
          "workspace"
        ],
        "type": "string"
      },
      "ParableDirectoryEntryView": {
        "properties": {
          "archivedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "authoringMode": {
            "$ref": "#/components/schemas/ParableAuthoringModeEnum"
          },
          "availability": {
            "$ref": "#/components/schemas/ParablePrimaryAvailabilityEnum"
          },
          "builtByParablePros": {
            "type": "boolean"
          },
          "contentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "context": {
            "$ref": "#/components/schemas/ParableDirectoryContextEnum"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "destination": {
            "description": "No preview here (PARABLE-6969). An entry is what Ponder reads through\nlist_parable_directory, read_directory_entry and\nfind_parable_directory_entry, and a preview is up to 32 KB of SVG per\nParable. The sidebar reads the previews with the entries from\nParableDirectoryPreviewResultView.",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "markers": {
            "items": {
              "$ref": "#/components/schemas/ParableLifecycleMarkerEnum"
            },
            "type": "array"
          },
          "pageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "platformParable": {
            "description": "A Platform Parable, which every Workspace has (PARABLE-6986): the sidebar\nfiles it with the other Platform Parables.",
            "type": "boolean"
          },
          "registrationKey": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "registrationRevisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rendererKey": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "parableId",
          "rootRefId",
          "context",
          "builtByParablePros",
          "platformParable",
          "authoringMode",
          "availability",
          "markers",
          "title",
          "destination",
          "updatedAt"
        ],
        "type": "object"
      },
      "ParableDirectoryPageResultView": {
        "properties": {
          "pages": {
            "items": {
              "$ref": "#/components/schemas/ParableDirectoryPageView"
            },
            "type": "array"
          },
          "totalAuthorized": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "pages",
          "totalAuthorized"
        ],
        "type": "object"
      },
      "ParableDirectoryPageView": {
        "properties": {
          "badge": {
            "nullable": true,
            "type": "string"
          },
          "description": {
            "description": "Every projected Custom Page carries a useful, non-blank description.",
            "maxLength": 1024,
            "minLength": 1,
            "pattern": "\\S",
            "type": "string"
          },
          "destination": {
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "parentPageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "projectionSource": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableCustomPageProjectionSourceEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "registrationPageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rendererKey": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "registrationPageId",
          "key",
          "name",
          "description",
          "destination"
        ],
        "type": "object"
      },
      "ParableDirectoryPreviewResultView": {
        "description": "The Directory with its previews, for the sidebar (PARABLE-6969). `entries`\nand `totalAuthorized` are what ParableDirectoryResultView holds. `previews`\nholds one item for each entry with a preview; an entry without one, and every\nCustom Parable, has none.",
        "properties": {
          "entries": {
            "items": {
              "$ref": "#/components/schemas/ParableDirectoryEntryView"
            },
            "type": "array"
          },
          "previews": {
            "items": {
              "$ref": "#/components/schemas/ParableDirectoryPreviewView"
            },
            "type": "array"
          },
          "totalAuthorized": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "entries",
          "previews",
          "totalAuthorized"
        ],
        "type": "object"
      },
      "ParableDirectoryPreviewView": {
        "description": "The preview of one Directory entry (PARABLE-6308): the SVG plate its sidebar\ncard shows, which the app draws as an image with `data-theme` set to the\nreader's theme.",
        "properties": {
          "previewSvg": {
            "type": "string"
          },
          "rootRefId": {
            "description": "The `rootRefId` of the entry this preview belongs to.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "rootRefId",
          "previewSvg"
        ],
        "type": "object"
      },
      "ParableDirectoryResultView": {
        "properties": {
          "entries": {
            "items": {
              "$ref": "#/components/schemas/ParableDirectoryEntryView"
            },
            "type": "array"
          },
          "totalAuthorized": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "entries",
          "totalAuthorized"
        ],
        "type": "object"
      },
      "ParableDraftEntityPackage": {
        "additionalProperties": false,
        "properties": {
          "details": {
            "items": {
              "$ref": "#/components/schemas/ParableDetails"
            },
            "nullable": true,
            "type": "array"
          },
          "implementations": {
            "items": {
              "$ref": "#/components/schemas/ParablePieceImplementation"
            },
            "nullable": true,
            "type": "array"
          },
          "packages": {
            "items": {
              "$ref": "#/components/schemas/ParablePackage"
            },
            "nullable": true,
            "type": "array"
          },
          "pages": {
            "items": {
              "$ref": "#/components/schemas/ParablePage"
            },
            "nullable": true,
            "type": "array"
          },
          "palettes": {
            "items": {
              "$ref": "#/components/schemas/ParablePalette"
            },
            "nullable": true,
            "type": "array"
          },
          "panes": {
            "items": {
              "$ref": "#/components/schemas/ParablePane"
            },
            "nullable": true,
            "type": "array"
          },
          "plots": {
            "items": {
              "$ref": "#/components/schemas/ParablePlot"
            },
            "nullable": true,
            "type": "array"
          },
          "reportPlans": {
            "items": {
              "$ref": "#/components/schemas/ParableReportPlan"
            },
            "nullable": true,
            "type": "array"
          },
          "reports": {
            "items": {
              "$ref": "#/components/schemas/ParableReport"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "type": "object"
      },
      "ParableEffectiveEntityPackage": {
        "properties": {
          "details": {
            "items": {
              "$ref": "#/components/schemas/ParableDetails"
            },
            "type": "array"
          },
          "implementations": {
            "items": {
              "$ref": "#/components/schemas/ParablePieceImplementation"
            },
            "type": "array"
          },
          "packages": {
            "items": {
              "$ref": "#/components/schemas/ParablePackage"
            },
            "type": "array"
          },
          "pages": {
            "items": {
              "$ref": "#/components/schemas/ParablePage"
            },
            "type": "array"
          },
          "palettes": {
            "items": {
              "$ref": "#/components/schemas/ParablePalette"
            },
            "type": "array"
          },
          "panes": {
            "items": {
              "$ref": "#/components/schemas/ParablePane"
            },
            "type": "array"
          },
          "plots": {
            "items": {
              "$ref": "#/components/schemas/ParablePlot"
            },
            "type": "array"
          },
          "reportPlans": {
            "items": {
              "$ref": "#/components/schemas/ParableReportPlan"
            },
            "type": "array"
          },
          "reports": {
            "items": {
              "$ref": "#/components/schemas/ParableReport"
            },
            "type": "array"
          }
        },
        "required": [
          "pages",
          "packages",
          "implementations",
          "panes",
          "plots",
          "palettes",
          "details",
          "reports",
          "reportPlans"
        ],
        "type": "object"
      },
      "ParableEffectivePackageRead": {
        "properties": {
          "labModeChangeDisabledReason": {
            "description": "Content-based mode-transition refusal, independent of edit permissions.",
            "nullable": true,
            "type": "string"
          },
          "labPackageImported": {
            "description": "Package presence remains visible when source inspection is unavailable.",
            "type": "boolean"
          },
          "namedTypes": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ParableNamedType"
            },
            "description": "Every named type the runtime bindings reach, once each, by key\n(PARABLE-6263): each binding's `namedType`, and every type it extends or a\nfield holds. A type whose Perception the reader may not view is left out,\nand so are the fields it gives another type.",
            "nullable": true,
            "type": "object"
          },
          "perceptionDeclarations": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Derived native Perception modules for the editor; never accepted on writes.",
            "nullable": true,
            "type": "object"
          },
          "perceptionSourceHashes": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Canonical native source hashes from this exact package read, keyed by Perception identity.",
            "nullable": true,
            "type": "object"
          },
          "pieceSurfaces": {
            "description": "One surface per Piece in this package, keyed by entityKey, plus the Parable\nroot's own.\nThey ride the package read rather than a per-Piece endpoint because the\ntree is already composed to answer this request: computing every surface\nfrom it is free, while a per-Piece call would re-compose the same tree once\nper click and put a round trip between selecting a Piece and seeing it.\nA Piece whose kind computes no surface is ABSENT rather than present with\nan empty panel list. Absent means \"this kind opens nothing\", which the\nrenderer draws as nothing; an empty list would draw as a frame with nothing\nin it, which is a different and wrong thing to show.",
            "items": {
              "$ref": "#/components/schemas/ParablePieceSurfaceEntryView"
            },
            "type": "array"
          },
          "pkg": {
            "$ref": "#/components/schemas/ParableEffectiveEntityPackage"
          },
          "readOnly": {
            "type": "boolean"
          },
          "refRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "renderBuild": {
            "description": "Reusable executable output for this exact source tree. Draft errors leave it null.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRenderBuild"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "renderBuildError": {
            "nullable": true,
            "type": "string"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rootSurface": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePieceSurfaceView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "runtimeBindings": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ParablePaneRuntimeBinding"
            },
            "nullable": true,
            "type": "object"
          },
          "selectedProposalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "selectedRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "selectedVersionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceLint": {
            "description": "One lint block per linted implementation in `pkg` (TSX, StyleX and Plot\nSQL), for the exact text in this read. A block whose revision has not been\nlinted yet is PENDING and the next read carries the answer; never accepted\non writes.",
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintView"
            },
            "type": "array"
          }
        },
        "required": [
          "labPackageImported",
          "sourceLint",
          "pieceSurfaces",
          "rootRefId",
          "selectedRefId",
          "refRevision",
          "readOnly",
          "pkg"
        ],
        "type": "object"
      },
      "ParableEntityKindEnum": {
        "description": "The canonical Parable entity kinds: the names the commit graph, the Rust\ncompose/merge core, merge conflicts, and commit entries all key on\n(parable_patch.entityKind). One enum, every consumer, so they share one\ndefinition rather than each restating the list (EDR-0077).\n\nThis set covers every vector in the generated effective/draft package.\nPLOT covers the whole Plot. PARABLE-1434 briefly had CHART and PLOT as two\nkinds, one per table, because the engine fields lived on a 1:1 extension; the\ntwo tables are one again (see ParablePlot), so the two kinds are one kind.\nHistorical rows tagged 'chart' are migrated to 'plot' by\n20260807032600_parable_plot_replaces_parable_chart.\n\nPerceptions and Policies are fields of their Page or Pane, so they have no\nentity kind of their own; a Preference is a setting outside the versioned\ntree.",
        "enum": [
          "page",
          "package",
          "implementation",
          "pane",
          "plot",
          "palette",
          "details",
          "report",
          "report_plan"
        ],
        "type": "string"
      },
      "ParableErrorView": {
        "properties": {
          "chatCode": {
            "description": "The chat code a person was shown for this failure, so a reopened thread\nshows the same title and copy as the live refusal. Null when the failure\nhas none, including every error saved before the field existed.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderChatError"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "code": {
            "description": "Application error code",
            "maxLength": 50,
            "pattern": "^[A-Z_][A-Z0-9_]*$",
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "retryable": {
            "type": "boolean"
          }
        },
        "required": [
          "code",
          "message",
          "retryable"
        ],
        "type": "object"
      },
      "ParableFilterCoverageEnum": {
        "description": "Which Plots a Parable filter Policy covers (PARABLE-5423, PARABLE-5701).",
        "enum": [
          "tree",
          "own"
        ],
        "type": "string"
      },
      "ParableFilterPolicy": {
        "additionalProperties": false,
        "description": "A filter Policy (PARABLE-5423): which rows each reader reads, and which\nshared settings each writer writes, in the Plots and Panes it covers.\n`covers` says which: `tree`, the Plots of the Page or Pane that holds it and\nof everything it declares at any depth, and a Page's child Pages; or `own`,\nonly the holder's own Plots. A Pane nothing declares, and a Page under no\nPage, fall under the Home Page, so a `tree` filter on Home covers every Pane\nof the Parable. A reader gets the union of the rules that admit\nthem, and `everyoneElse` when none does, as a Provider Policy; the Primary is\nnever narrowed, so a condition every reader gets belongs in the Plot's SQL.\n`actions` names the verbs it narrows, as a Postgres row policy names its\ncommands (PARABLE-5701): `view` the rows of the Plots it covers; `create`\nthe setting a writer saves new; `edit` both the stored setting and the value\nreplacing it; `delete` the stored setting. The write verbs apply to the\ncovered Panes' shared settings, This Parable's and every group's.\nA `tree` filter applies above the Plot a read asks for, above each Plot a\nstatement names, and at a scan inside another Plot's SQL when it does not\ncover that Plot; an `own` filter applies at every scan of its Plots. Runs\napply none. `enabled` is the authored switch, and a boolean This Parable\nsetting named by `enabledFromSetting` switches it live.",
        "properties": {
          "actions": {
            "items": {
              "$ref": "#/components/schemas/ParablePolicyActionEnum"
            },
            "maxItems": 4,
            "minItems": 1,
            "type": "array"
          },
          "covers": {
            "$ref": "#/components/schemas/ParableFilterCoverageEnum"
          },
          "enabled": {
            "type": "boolean"
          },
          "enabledFromSetting": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicySettingRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "everyoneElse": {
            "$ref": "#/components/schemas/ProviderPolicyAccessRule"
          },
          "key": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "rules": {
            "items": {
              "$ref": "#/components/schemas/ParableFilterRule"
            },
            "maxItems": 20,
            "type": "array"
          }
        },
        "required": [
          "key",
          "name",
          "actions",
          "covers",
          "enabled",
          "rules",
          "everyoneElse"
        ],
        "type": "object"
      },
      "ParableFilterRule": {
        "additionalProperties": false,
        "description": "One audience of a filter Policy (PARABLE-5423): the readers its grant admits\n(levels, people, Workspace roles, or a setting) and what they read. `key`\nstays the same across saves. `conditions` are SQL over the output columns of\nthe Plots the filter covers, ANDed; present exactly when `access` is\nROWS_WHERE. For a filter's write actions (create, edit, delete), they read\nthe setting's columns instead: pane_key, handle, actor_kind, actor_id and\nvalue.",
        "properties": {
          "access": {
            "$ref": "#/components/schemas/ProviderPolicyAccess"
          },
          "admits": {
            "$ref": "#/components/schemas/ParablePolicyGrant"
          },
          "conditions": {
            "items": {
              "description": "SQL text",
              "minLength": 1,
              "pattern": "^[\\s\\S]*$",
              "type": "string"
            },
            "maxItems": 100,
            "type": "array"
          },
          "key": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "key",
          "admits",
          "access",
          "conditions"
        ],
        "type": "object"
      },
      "ParableLifecycleActionCapabilitiesView": {
        "properties": {
          "canArchiveParable": {
            "description": "The three acts whose subject is the PARABLE, not one organization's line\nand not a Proposal (PARABLE-1845).\n\nThey exist because the `Primary` fields above are the DEPLOYMENT seat --\nPocket and Restore on a Deployment, Responsible, your own line -- and the\nadmin apex was reading canArchivePrimary to decide whether to offer a\ncontrol that archives the whole Parable for every organization that holds\nit. One word, three targets, two seats: the target keying (PARABLE-1802)\nis what makes them separable, and these fields are what carries the\nseparation to the interface.\n\nAdmin-only in practice, because the three routes behind them are declared\non web-admin-api alone. They read false on the Workspace surface, which is\nthe surface gate in the contract answering rather than a special case here.",
            "type": "boolean"
          },
          "canArchivePrimary": {
            "type": "boolean"
          },
          "canArchiveProposal": {
            "type": "boolean"
          },
          "canDeleteParable": {
            "description": "Delete has no `Primary` sibling: a Deployment is never deleted, it is\nPocketed. This is the only field that projects a terminal act on a Parable,\nand before PARABLE-1835 the control behind it had no capability field at\nall -- it was always offered, and the endpoint behind it always ran.",
            "type": "boolean"
          },
          "canDiscardProposal": {
            "type": "boolean"
          },
          "canRestoreParable": {
            "type": "boolean"
          },
          "canRestorePrimary": {
            "type": "boolean"
          },
          "canRestoreProposal": {
            "type": "boolean"
          },
          "canRetryDelivery": {
            "type": "boolean"
          }
        },
        "required": [
          "canArchivePrimary",
          "canRestorePrimary",
          "canArchiveProposal",
          "canRestoreProposal",
          "canDiscardProposal",
          "canRetryDelivery",
          "canArchiveParable",
          "canRestoreParable",
          "canDeleteParable"
        ],
        "type": "object"
      },
      "ParableLifecycleMarkerEnum": {
        "enum": [
          "pending_changes",
          "proposed_changes",
          "update_available"
        ],
        "type": "string"
      },
      "ParableMessageRegarding": {
        "description": "Typed Message or Piece references that a Problem message concerns.",
        "discriminator": {
          "mapping": {
            "message": "#/components/schemas/MessageRegardingMessage",
            "piece": "#/components/schemas/MessageRegardingPiece"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/MessageRegardingMessage"
          },
          {
            "$ref": "#/components/schemas/MessageRegardingPiece"
          }
        ]
      },
      "ParableMessageRegardingKindEnum": {
        "enum": [
          "message",
          "piece"
        ],
        "type": "string"
      },
      "ParableMilestone": {
        "description": "A milestone with its current state for this tenant and its provider list. state is computed -- ENABLED / REQUIRED / OPTIONAL -- never stored. providers is populated for FIXED_PROVIDERS milestones; empty for DYNAMIC_TOOL_GROUPS.",
        "properties": {
          "contentVariant": {
            "$ref": "#/components/schemas/MilestoneContentVariantEnum"
          },
          "guidanceText": {
            "type": "string"
          },
          "icon": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "pendingDelegation": {
            "description": "Non-null when a delegation request is in flight for this milestone (sent but integrator has not yet connected).\nNull when no request has been sent or the milestone is already enabled.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PendingMilestoneDelegation"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "providers": {
            "items": {
              "$ref": "#/components/schemas/MilestoneProvider"
            },
            "type": "array"
          },
          "required": {
            "type": "boolean"
          },
          "sortOrder": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "state": {
            "$ref": "#/components/schemas/MilestoneStateEnum"
          }
        },
        "required": [
          "id",
          "name",
          "guidanceText",
          "required",
          "contentVariant",
          "sortOrder",
          "state",
          "providers"
        ],
        "type": "object"
      },
      "ParableNamedType": {
        "description": "One named type, an interface or a type alias, as the Perception compiler\nread it (PARABLE-6263). A package read holds each one once, in its\n`namedTypes`, and each runtime binding names its Pane's by key. Pane code\nreads it to show what a Pane holds, such as a Parable's ontology page.\nThe compiler emits it beside the Perception's contract, never inside it:\nnothing validates against it and no contract hash includes it, so editing a\ndoc comment, which only this document carries, leaves every stored Refresh\nreadable. It is part of the Perception that declares it: a reader who may\nnot view that Perception does not receive it.",
        "properties": {
          "description": {
            "description": "Its doc comment, without the comment markers, tags such as `@grouping`\nincluded; null when it has none.",
            "nullable": true,
            "type": "string"
          },
          "extends": {
            "description": "The keys of the interfaces its declaration extends, in the order it names\nthem: `interface Meeting extends Arc, Artifact` extends Arc and Artifact.\nEmpty for a type alias.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "fields": {
            "description": "The fields it has that no type it extends gives it: those it declares,\nand those it takes from a type it does not extend. A field a parent gives\nis listed once, on the parent. Its full set is these, then each extended\ntype's full set in order, a name listed once.",
            "items": {
              "$ref": "#/components/schemas/ParableNamedTypeField"
            },
            "type": "array"
          },
          "key": {
            "description": "Its key in the read's namedTypes: the key of the Pane whose Perception\ndeclares it, or the platform module that declares it, then # and its name,\nsuch as `\u003cPane key\u003e#Meeting` or `parable/foundation#ProviderRef`.",
            "type": "string"
          },
          "name": {
            "description": "Its declared name, such as Meeting.",
            "type": "string"
          },
          "paneKey": {
            "description": "The Pane whose Perception declares it; null for a platform type such as ProviderRef.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "key",
          "name",
          "extends",
          "fields"
        ],
        "type": "object"
      },
      "ParableNamedTypeField": {
        "description": "One field of a named type, as the Perception compiler read it\n(PARABLE-6263).",
        "properties": {
          "declaredIn": {
            "description": "The key of the named type whose declaration holds the field, when that is\nneither this type nor one it extends, such as a type a type alias\ncombines; null for a field this type declares itself.",
            "nullable": true,
            "type": "string"
          },
          "description": {
            "description": "Its doc comment, without the comment markers; null when it has none.",
            "nullable": true,
            "type": "string"
          },
          "list": {
            "description": "True for a list: `readonly T[]`.",
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "namedType": {
            "description": "The key of the named type the field holds, or its list holds, in the\nread's namedTypes; null when it holds none.",
            "nullable": true,
            "type": "string"
          },
          "nullable": {
            "description": "True when the field may hold null, or may be left out (`name?: T`).",
            "type": "boolean"
          },
          "type": {
            "description": "The field's scalar-lib type, such as Generic.Text or Temporal.DateTime; the\nname of the named type it holds, such as ProviderRef; or any other type as\nTypeScript prints it, such as string or \"estimate\" | \"correction\". A list\nnames its item's type.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "type",
          "list",
          "nullable"
        ],
        "type": "object"
      },
      "ParablePackage": {
        "properties": {
          "deletedOnRef": {
            "type": "boolean"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "handlePinned": {
            "type": "boolean"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "order": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "packageKey": {
            "description": "Null only for the fixed root \"Packages\" folder.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "panelDefaultState": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelStateEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "required": [
          "entityKey",
          "deletedOnRef",
          "order",
          "name",
          "handle",
          "handlePinned"
        ],
        "type": "object"
      },
      "ParablePackageRevisionRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          }
        },
        "required": [
          "kind",
          "pieceId",
          "revision"
        ],
        "type": "object"
      },
      "ParablePage": {
        "properties": {
          "defaultPreviewSize": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableViewportSizeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "deletedOnRef": {
            "type": "boolean"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "entry": {
            "type": "boolean"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "handlePinned": {
            "type": "boolean"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "order": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "panelDefaultState": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelStateEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "parentPageKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "perceptionManifest": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerceptionManifest"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "perceptionSource": {
            "description": "The Perception and Policies are part of the Page, versioned with it.\nperceptionManifest is compiled by the server from perceptionSource at the\nsave boundary; a draft may omit it or echo the stored value. Null only for a\nCustom Page.",
            "maxLength": 262144,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "policies": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicies"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "entityKey",
          "deletedOnRef",
          "order",
          "name",
          "handle",
          "handlePinned",
          "entry"
        ],
        "type": "object"
      },
      "ParablePageRevisionRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          }
        },
        "required": [
          "kind",
          "pieceId",
          "revision"
        ],
        "type": "object"
      },
      "ParablePalette": {
        "description": "The CSS for a Pane or Page: one per owner, addressed by its owner. It\ncarries no name, handle, description or icon, and it is outside the handle\nnamespace.",
        "properties": {
          "defaultPreviewSize": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableViewportSizeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "deletedOnRef": {
            "type": "boolean"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "order": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "ownerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ownerKind": {
            "$ref": "#/components/schemas/ParablePieceOwnerKindEnum"
          },
          "panelDefaultState": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelStateEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "previewTargetKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "entityKey",
          "deletedOnRef",
          "ownerKind",
          "ownerKey",
          "order"
        ],
        "type": "object"
      },
      "ParablePaletteRevisionRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          }
        },
        "required": [
          "kind",
          "pieceId",
          "revision"
        ],
        "type": "object"
      },
      "ParablePane": {
        "properties": {
          "defaultPreviewSize": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableViewportSizeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "deletedOnRef": {
            "type": "boolean"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "handlePinned": {
            "type": "boolean"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "order": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "packageKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "panelDefaultState": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelStateEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "perceptionManifest": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerceptionManifest"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "perceptionSource": {
            "description": "The Perception and Policies are part of the Pane, versioned with it.\nperceptionManifest is compiled by the server from perceptionSource at the\nsave boundary; a draft may omit it or echo the stored value. Null only on a\ntombstone.",
            "maxLength": 262144,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "policies": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicies"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "entityKey",
          "deletedOnRef",
          "packageKey",
          "order",
          "name",
          "handle",
          "handlePinned"
        ],
        "type": "object"
      },
      "ParablePanePreviewInjection": {
        "description": "Everything the headless preview page needs to draw one Pane, and nothing a\nbrowser is trusted to decide. web-api authorizes the Message that asked and\ninjects this already-authorized payload; the page holds no credential and\nrenders nothing when nothing was injected.",
        "properties": {
          "build": {
            "$ref": "#/components/schemas/ParableRenderBuild"
          },
          "entryPieceKey": {
            "type": "string"
          },
          "namedTypes": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ParableNamedType"
            },
            "description": "The named types those bindings reach, by key, from the package read the\nsnapshot was taken from (PARABLE-6263).",
            "nullable": true,
            "type": "object"
          },
          "preferences": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ParablePreferenceView"
            },
            "description": "The settings the requester can read for the previewed Panes, by setting id.",
            "type": "object"
          },
          "resolution": {
            "description": "Captured under the requester by the server; a build alone never authorizes resolution.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePaneResolveBatchResult"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "runtimeBindings": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ParablePaneRuntimeBinding"
            },
            "description": "The saved binding per Pane as web-api holds it, keyed by Piece key.",
            "nullable": true,
            "type": "object"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "build",
          "entryPieceKey",
          "title",
          "preferences"
        ],
        "type": "object"
      },
      "ParablePaneResolutionError": {
        "properties": {
          "code": {
            "$ref": "#/components/schemas/ParablePaneResolutionErrorCodeEnum"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "message"
        ],
        "type": "object"
      },
      "ParablePaneResolutionErrorCodeEnum": {
        "description": "A hidden and a missing Pane use the same unavailable result.",
        "enum": [
          "unavailable",
          "invalid_selection",
          "revision_conflict"
        ],
        "type": "string"
      },
      "ParablePaneResolveBatchInput": {
        "description": "Request context supplies reading coordinates, never trusted identity or grants.",
        "properties": {
          "context": {
            "$ref": "#/components/schemas/ParableContext"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParablePaneResolveInput"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "context",
          "items"
        ],
        "type": "object"
      },
      "ParablePaneResolveBatchResult": {
        "properties": {
          "context": {
            "$ref": "#/components/schemas/ParableContext"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParablePaneResolveResult"
            },
            "type": "array"
          }
        },
        "required": [
          "context",
          "items"
        ],
        "type": "object"
      },
      "ParablePaneResolveInput": {
        "description": "At most one selector: a saved setting of the Pane, or a value its parent passes.",
        "properties": {
          "capabilitiesOnly": {
            "description": "Resolve editor eligibility without revealing data, source, bindings, or schemas.",
            "type": "boolean"
          },
          "hasPrimitive": {
            "description": "Distinguishes an explicit frontend null from absence of a selected value.",
            "type": "boolean"
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "preferenceId": {
            "description": "A setting of this Pane the reader may read.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "primitive": {
            "description": "Any valid JSON value: object, array, primitive, or null",
            "nullable": true
          },
          "requestKey": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "requestKey",
          "paneKey",
          "capabilitiesOnly",
          "hasPrimitive"
        ],
        "type": "object"
      },
      "ParablePaneResolveResult": {
        "description": "Exactly one of value/error is present. A refused item does not discard permitted siblings.",
        "properties": {
          "error": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePaneResolutionError"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "requestKey": {
            "type": "string"
          },
          "value": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableResolvedPaneValue"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "requestKey",
          "paneKey"
        ],
        "type": "object"
      },
      "ParablePaneRevisionRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          }
        },
        "required": [
          "kind",
          "pieceId",
          "revision"
        ],
        "type": "object"
      },
      "ParablePaneRuntimeBinding": {
        "description": "Server-derived identities. Settings are read separately under the Pane's Policies.",
        "properties": {
          "acceptsNull": {
            "description": "The Pane renders with no value from its parent. A Pane that declares\n`preferences` always does: its primitive is the kind it shows, not an\ninput it waits for.",
            "type": "boolean"
          },
          "handle": {
            "description": "Current declared handle; consumers also accept the stable paneKey.",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "namedType": {
            "description": "The key of the named type the Pane shows, its primitive's, in the read's\n`namedTypes` (PARABLE-6263). Pane code reads that type as the module's\n`namedType` and as `panes.\u003cname\u003e.namedType`. Null when the primitive is\nnull or is not one named type, or when the reader may not view the\nPerception that declares it. It is not part of `primitiveContractHash` or\nany Plot's `contractHash`.",
            "nullable": true,
            "type": "string"
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "panes": {
            "additionalProperties": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "description": "Local reference names to other Panes, derived from the Perception.",
            "type": "object"
          },
          "plots": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ParableRuntimePlotBinding"
            },
            "type": "object"
          },
          "preferencesSchema": {
            "description": "Native representation of the Pane's Preference values when its Perception\ndeclares `preferences` (PARABLE-5538). Null when it does not: its\nPreferences are then typed by its primitive and hydrate with\nprimitiveSchema.",
            "nullable": true
          },
          "primitiveContractHash": {
            "description": "Fingerprint of the compiled contract of the Pane's Preference values,\nvalidation and native hydration, including resolved imports: its\n`preferences` when declared, else its primitive.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "primitiveSchema": {
            "description": "Compiler-derived native representation for this exact definition; contains no private source constraints."
          }
        },
        "required": [
          "handle",
          "panes",
          "primitiveSchema",
          "primitiveContractHash",
          "paneKey",
          "acceptsNull",
          "plots"
        ],
        "type": "object"
      },
      "ParableParticipantPermissionEnum": {
        "description": "Stable capabilities of participation in one Parable, resolved from its actor assignments.",
        "enum": [
          "primary",
          "publishing",
          "pinging",
          "peeping"
        ],
        "type": "string"
      },
      "ParablePatchOperationEnum": {
        "description": "Operation recorded by one parable_patch delta row (EDR-0077 commit\ngraph). Uppercase values match the @versioned history `operation` column\nconvention (INSERT/UPDATE/DELETE); ADD is used instead of INSERT because a\ncommit entry records the entity joining the tree, not a physical row insert.",
        "enum": [
          "ADD",
          "UPDATE",
          "DELETE"
        ],
        "type": "string"
      },
      "ParablePerceptionManifest": {
        "description": "Server-derived projection of a compiled native Perception declaration.\nThis is runtime/editor output, never a second independently authored schema.",
        "properties": {
          "palette": {
            "description": "The Palette the renderer applies: a Palette key or an owner handle. A\ndeclaration edit preserves the selection. Policies are not attached here;\nthey are a column of the Page or Pane.",
            "type": "string"
          },
          "panes": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Local reference names resolved from the declaration to stable Pane identities.",
            "type": "object"
          },
          "plots": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "The owner's Plots, populated by the host when Plots are created or changed.",
            "type": "object"
          },
          "plottedPath": {
            "description": "When the platform writes the Pane's Plotted Path ahead of its first\nreader, from `@plottedPath publish` or `@plottedPath report` in the\nPerception's doc comment (PARABLE-5951). Absent otherwise: the path is\nwritten when a reader first opens it, and an unmarked manifest serializes\nexactly as before.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlottedPathPrecomputeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "plumbing": {
            "description": "True when the Perception's doc comment carries `@plumbing`: the Pane only\nserves other Panes (shared state, a kit, a preview), so Plotted Path\nnever offers it as a part to open (PARABLE-5951). Absent otherwise, so an\nunmarked manifest serializes exactly as before.",
            "nullable": true,
            "type": "boolean"
          },
          "preferenceModes": {
            "description": "The declared mode of the Preferences. Absent when the Perception wraps its\n`preferences` in neither Live nor Versioned, so a manifest that declares\nno mode serializes exactly as before (and its hash is unchanged): every\nhandle is then Live.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePreferenceModes"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "providerGroups": {
            "description": "The Providers the Parable reads, as groups in the order its Home Page's\nPerception declares them (PARABLE-6343). Only the Home Page declares\nthem; absent on every other Page and Pane and on a Home Page that\ndeclares none, so such a manifest serializes exactly as before.",
            "items": {
              "$ref": "#/components/schemas/ParableProviderGroup"
            },
            "nullable": true,
            "type": "array"
          },
          "valueSchema": {
            "description": "JSON Schema derived by the TypeScript compiler for Preference.value.\nNullable while the one-time native-declaration migration is materialized.",
            "nullable": true
          }
        },
        "required": [
          "panes",
          "plots",
          "palette"
        ],
        "type": "object"
      },
      "ParablePerceptionSourceReceipt": {
        "properties": {
          "storedSourceHash": {
            "type": "string"
          },
          "submittedSourceHash": {
            "type": "string"
          }
        },
        "required": [
          "submittedSourceHash",
          "storedSourceHash"
        ],
        "type": "object"
      },
      "ParablePerformanceAppRead": {
        "description": "One read the web app made upstream (web-api or web-admin-api) while it\nanswered a document or a route's data (PARABLE-5891).",
        "properties": {
          "durationMs": {
            "description": "How long the web app waited for it.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "route": {
            "description": "The read's method and route, with its ids left out: `GET /api/parable/authoring/primaries/:id/package`.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "route",
          "durationMs"
        ],
        "type": "object"
      },
      "ParablePerformanceBuildEnum": {
        "description": "A development build renders twice, so its render counts read double.",
        "enum": [
          "development",
          "production"
        ],
        "type": "string"
      },
      "ParablePerformanceCacheOutcomeEnum": {
        "enum": [
          "hit",
          "miss",
          "shared"
        ],
        "type": "string"
      },
      "ParablePerformanceDocumentEnum": {
        "description": "The document a long frame or an input ran in: the app, or the Page frame.",
        "enum": [
          "app",
          "page"
        ],
        "type": "string"
      },
      "ParablePerformanceHint": {
        "description": "Something the recording shows that someone can change, with the interactions that show it.",
        "properties": {
          "audience": {
            "$ref": "#/components/schemas/ParablePerformanceHintAudienceEnum"
          },
          "interactionIds": {
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          },
          "message": {
            "description": "The hint in one or two sentences, with its evidence.",
            "maxLength": 600,
            "minLength": 1,
            "type": "string"
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rule": {
            "$ref": "#/components/schemas/ParablePerformanceHintRuleEnum"
          }
        },
        "required": [
          "rule",
          "audience",
          "message",
          "interactionIds"
        ],
        "type": "object"
      },
      "ParablePerformanceHintAudienceEnum": {
        "description": "Who can act on a hint: the Parable's author, or the platform.",
        "enum": [
          "parable",
          "platform"
        ],
        "type": "string"
      },
      "ParablePerformanceHintRuleEnum": {
        "enum": [
          "pipeline_candidate",
          "redraws",
          "truncated",
          "pane_blocks",
          "never_settled",
          "same_read_twice",
          "rechecks",
          "focus_re_read",
          "before_query"
        ],
        "type": "string"
      },
      "ParablePerformanceInputDelay": {
        "description": "The person's input that started the interaction, until the next frame drew.",
        "properties": {
          "durationMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "inputDelayMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "presentationMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "processingMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "target": {
            "description": "A data-testid or a Pane's name; never text the person typed.",
            "maxLength": 200,
            "nullable": true,
            "type": "string"
          },
          "where": {
            "$ref": "#/components/schemas/ParablePerformanceDocumentEnum"
          }
        },
        "required": [
          "durationMs",
          "inputDelayMs",
          "processingMs",
          "presentationMs",
          "where"
        ],
        "type": "object"
      },
      "ParablePerformanceInteraction": {
        "description": "One interaction, from the person's input to the last Pane drawing its data.",
        "properties": {
          "durationMs": {
            "description": "Null while it is still running.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "entryPieceKey": {
            "description": "The Page or Pane it drew, and where a switch or an open came from.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "frameConnects": {
            "description": "More than one when the Page frame's document reloaded.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "fromParableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "fromPieceKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "hidden": {
            "description": "Whether the browser tab was in the background at some point during it.",
            "type": "boolean"
          },
          "id": {
            "description": "Local to the recording.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "input": {
            "description": "The input that started it, when the browser measured one.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformanceInputDelay"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "kind": {
            "$ref": "#/components/schemas/ParablePerformanceInteractionKindEnum"
          },
          "largestPaintMs": {
            "description": "The largest paint after it began, when the browser reports soft navigations.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "longFrames": {
            "items": {
              "$ref": "#/components/schemas/ParablePerformanceLongFrame"
            },
            "maxItems": 500,
            "minItems": 0,
            "type": "array"
          },
          "outcome": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformanceOutcomeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "pageReadyBy": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformancePageReadyEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "pageReadyMs": {
            "description": "When the Page reported every Pane drawn, and what decided it.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "panes": {
            "items": {
              "$ref": "#/components/schemas/ParablePerformancePane"
            },
            "maxItems": 500,
            "minItems": 0,
            "type": "array"
          },
          "parableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "phases": {
            "items": {
              "$ref": "#/components/schemas/ParablePerformancePhase"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "plotReads": {
            "items": {
              "$ref": "#/components/schemas/ParablePerformancePlotRead"
            },
            "maxItems": 1000,
            "minItems": 0,
            "type": "array"
          },
          "recorderMs": {
            "description": "What recording itself cost on the main thread during it.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "requests": {
            "items": {
              "$ref": "#/components/schemas/ParablePerformanceRequest"
            },
            "maxItems": 200,
            "minItems": 0,
            "type": "array"
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "trigger": {
            "$ref": "#/components/schemas/ParablePerformanceTriggerEnum"
          },
          "viewAs": {
            "description": "Whether a View as preview was on; never whom it previewed.",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "kind",
          "trigger",
          "startedAt",
          "viewAs",
          "frameConnects",
          "phases",
          "requests",
          "panes",
          "plotReads",
          "longFrames",
          "hidden",
          "recorderMs"
        ],
        "type": "object"
      },
      "ParablePerformanceInteractionKindEnum": {
        "description": "What the person did.",
        "enum": [
          "page_load",
          "parable_switch",
          "piece_open",
          "reading",
          "view_as",
          "refresh",
          "publish",
          "re_read",
          "in_page",
          "redraw"
        ],
        "type": "string"
      },
      "ParablePerformanceLongFrame": {
        "description": "A long animation frame in the app or the Page frame.",
        "properties": {
          "blockingMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "durationMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "functionName": {
            "maxLength": 200,
            "nullable": true,
            "type": "string"
          },
          "invoker": {
            "description": "Such as FrameRequestCallback.",
            "maxLength": 200,
            "nullable": true,
            "type": "string"
          },
          "paneKey": {
            "description": "The Pane whose code ran in it, when the frame could tell.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "startMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "where": {
            "$ref": "#/components/schemas/ParablePerformanceDocumentEnum"
          }
        },
        "required": [
          "startMs",
          "durationMs",
          "blockingMs",
          "where"
        ],
        "type": "object"
      },
      "ParablePerformanceOutcomeEnum": {
        "enum": [
          "complete",
          "interrupted",
          "failed",
          "hidden"
        ],
        "type": "string"
      },
      "ParablePerformancePageReadyEnum": {
        "description": "What decided the Page was ready: the frame's own report, or the app's 8 s ceiling.",
        "enum": [
          "frame",
          "ceiling"
        ],
        "type": "string"
      },
      "ParablePerformancePane": {
        "description": "A Page or Pane the interaction drew, placed in the tree under the Piece that declares it.",
        "properties": {
          "answeredMs": {
            "description": "When the last of its own reads answered, and when that answer's rows were on screen.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "depth": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 64,
            "minimum": 0,
            "type": "integer"
          },
          "drawnMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "filtersApply": {
            "description": "The resolved Policies say conditions apply to this reader.",
            "nullable": true,
            "type": "boolean"
          },
          "handle": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "heldPage": {
            "description": "Its data reached the screen last, so the Page waited for it.",
            "type": "boolean"
          },
          "inputs": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "moduleBytes": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "moduleMs": {
            "description": "How long its module took to load and evaluate, and when it first drew.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "name": {
            "maxLength": 200,
            "nullable": true,
            "type": "string"
          },
          "paintMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "paletteBytes": {
            "description": "The bytes of its compiled CSS (its Palette) and of its module.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parentPaneKey": {
            "description": "The Page or Pane that declares it; null for the interaction's own Piece.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "renderMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "renders": {
            "description": "Renders of its own component during the interaction, their time, and the new inputs it received.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "resolvedMs": {
            "description": "When its resolution arrived.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "paneKey",
          "handle",
          "depth",
          "heldPage"
        ],
        "type": "object"
      },
      "ParablePerformancePhase": {
        "description": "One phase of an interaction, on its clock.",
        "properties": {
          "endMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "phase": {
            "$ref": "#/components/schemas/ParablePerformancePhaseEnum"
          },
          "startMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "phase",
          "startMs",
          "endMs"
        ],
        "type": "object"
      },
      "ParablePerformancePhaseEnum": {
        "enum": [
          "loader",
          "frame_boot",
          "mosaic",
          "pane_resolution",
          "page_swap",
          "plot_reads"
        ],
        "type": "string"
      },
      "ParablePerformancePlotRead": {
        "description": "One Plot read a Pane made.",
        "properties": {
          "cache": {
            "$ref": "#/components/schemas/ParablePerformanceReadCacheEnum"
          },
          "endMs": {
            "description": "Null while the read is still out.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "errorCode": {
            "description": "Such as QL-TO-002.",
            "maxLength": 64,
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Local to the recording.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "outcome": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformanceReadOutcomeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "paneKey": {
            "description": "The Pane whose scope declares the Plot.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parameterCount": {
            "description": "How many parameters it passed, and a hash that matches equal reads; never the values.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "parameterHash": {
            "maxLength": 64,
            "nullable": true,
            "type": "string"
          },
          "plotHandle": {
            "description": "The Plot's handle in that Pane, and its name.",
            "maxLength": 200,
            "nullable": true,
            "type": "string"
          },
          "plotKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotName": {
            "maxLength": 200,
            "nullable": true,
            "type": "string"
          },
          "refreshAt": {
            "description": "The Refresh a stored read came from, when it names one.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "rows": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "server": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformanceServerTiming"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "sizeBytes": {
            "description": "The answer's bytes as the web app sent them, for a read that went to the server.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "startMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "stored": {
            "description": "True when the rows came from a Pipeline's stored output.",
            "nullable": true,
            "type": "boolean"
          },
          "truncated": {
            "nullable": true,
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "startMs",
          "cache"
        ],
        "type": "object"
      },
      "ParablePerformanceReadCacheEnum": {
        "description": "Where a read's answer came from: the server, a read already in flight, or the session.",
        "enum": [
          "server",
          "shared",
          "kept"
        ],
        "type": "string"
      },
      "ParablePerformanceReadOutcomeEnum": {
        "enum": [
          "ok",
          "refused",
          "timeout",
          "failed",
          "aborted"
        ],
        "type": "string"
      },
      "ParablePerformanceRecording": {
        "description": "One browser tab's recording for one Parable.",
        "properties": {
          "build": {
            "$ref": "#/components/schemas/ParablePerformanceBuildEnum"
          },
          "droppedInteractions": {
            "description": "Older interactions dropped to stay within the bound.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "hints": {
            "items": {
              "$ref": "#/components/schemas/ParablePerformanceHint"
            },
            "maxItems": 50,
            "minItems": 0,
            "type": "array"
          },
          "interactions": {
            "description": "Newest first.",
            "items": {
              "$ref": "#/components/schemas/ParablePerformanceInteraction"
            },
            "maxItems": 200,
            "minItems": 0,
            "type": "array"
          },
          "parableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parableName": {
            "maxLength": 200,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "parableKey",
          "build",
          "interactions",
          "droppedInteractions",
          "hints"
        ],
        "type": "object"
      },
      "ParablePerformanceRequest": {
        "description": "A request the app made for the interaction: its document, a loader request, a Pane resolution.",
        "properties": {
          "endMs": {
            "description": "Null while it is still out.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/ParablePerformanceRequestKindEnum"
          },
          "ok": {
            "nullable": true,
            "type": "boolean"
          },
          "server": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformanceServerTiming"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "sizeBytes": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "startMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "startMs"
        ],
        "type": "object"
      },
      "ParablePerformanceRequestKindEnum": {
        "enum": [
          "document",
          "loader",
          "pane_resolution"
        ],
        "type": "string"
      },
      "ParablePerformanceServerTiming": {
        "description": "Where an answer's server time went, from the Server-Timing entries it\ncarried. A part a server did not report is null.",
        "properties": {
          "admitCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "admitMs": {
            "description": "Admitting the reader to stored outputs while planning, inside its parts, and how many.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "apiDbMs": {
            "description": "web-api's own web-db time and statements.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "apiDbStatements": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "apiMs": {
            "description": "web-api's handler.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "apiPolicyMs": {
            "description": "web-api resolving the reader's grant and deciding Parable Policies.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "appMs": {
            "description": "The web app: from the request reaching it to its answer.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "appReads": {
            "description": "The reads the web app made upstream while it answered, longest first: what\na document's or a route's data's time in the web app waited on. They may\noverlap, so they can add up to more than appMs (PARABLE-5891).",
            "items": {
              "$ref": "#/components/schemas/ParablePerformanceAppRead"
            },
            "maxItems": 40,
            "minItems": 0,
            "nullable": true,
            "type": "array"
          },
          "compiledPlot": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformanceCacheOutcomeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "compiledPlotMs": {
            "description": "Getting the read's compiled Plots, and whether the cache had them.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "permitMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "planBindMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "planMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "planPhysicalMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "planSessionMs": {
            "description": "Planning's parts (PARABLE-5636), each summed over both planning passes:\nbuilding the read's session, binding the Plots its SQL names, planning\nthe SQL, and the physical plan. They break planMs down and sum to a little\nless than it; they never add to it.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "planSqlMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "queryLayerDbMs": {
            "description": "The Query Layer's own web-db calls.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "queryLayerMs": {
            "description": "The Query Layer call, as web-api waited for it.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "readmitCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "readmitMs": {
            "description": "The same admissions again during the run, inside runMs, and how many.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "recheckAsks": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "recheckMs": {
            "description": "Provider Policy rechecks during the run, inside runMs: the wall-clock time\nwhile any recheck waited, and how many web-db answers they asked for\n(PARABLE-5670). A Query Layer that sends no count summed each scan's\nwaits instead, so its time can exceed runMs.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "runMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "snapshot": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformanceCacheOutcomeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "type": "object"
      },
      "ParablePerformanceTriggerEnum": {
        "enum": [
          "pointer",
          "keyboard",
          "navigation",
          "window_focus",
          "live_change"
        ],
        "type": "string"
      },
      "ParablePieceDiagnostics": {
        "properties": {
          "documents": {
            "items": {
              "$ref": "#/components/schemas/ParablePieceDocumentDiagnostics"
            },
            "type": "array"
          },
          "handle": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "pending": {
            "description": "True while a check has not answered for the current text; read again shortly.",
            "type": "boolean"
          },
          "perceptionSource": {
            "description": "A Page's or Pane's Perception source, as read_parable_contents carries it,\nso one Piece is read whole without reading the whole Parable. Null for a\nPlot or a Palette, and in edit_piece_source's answer.",
            "nullable": true,
            "type": "string"
          },
          "pieceKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "policies": {
            "description": "A Page's or Pane's Policies, as read_parable_contents carries them for the\nsame reader. Null for a Plot or a Palette, and in edit_piece_source's\nanswer.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicies"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "proposalId": {
            "description": "The Changes the documents were read from; null for the Parable's own content.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refId": {
            "description": "The ref the documents were read from: the selected Changes' draft, or the Parable's own.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refVersion": {
            "description": "That ref's version. Pass it as `expectedRefVersion` to edit_piece_source.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "summary": {
            "$ref": "#/components/schemas/ParableSourceLintSummary",
            "description": "Errors, warnings and notes across every document and check."
          }
        },
        "required": [
          "pieceKey",
          "name",
          "handle",
          "refId",
          "refVersion",
          "documents",
          "summary",
          "pending"
        ],
        "type": "object"
      },
      "ParablePieceDocumentDiagnostics": {
        "description": "One document of a Piece: its text and every current diagnostic for exactly that text.",
        "properties": {
          "build": {
            "description": "The compile into the module the renderer runs; null for a document that is not compiled on its own.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableSourceLint"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "document": {
            "$ref": "#/components/schemas/ParablePieceDocumentEnum",
            "description": "`source` for a Page's, Pane's or Plot's code; `palette` for a Page's or Pane's Palette."
          },
          "implementationEntityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "language": {
            "$ref": "#/components/schemas/ParablePieceLanguageEnum"
          },
          "lint": {
            "$ref": "#/components/schemas/ParableSourceLint",
            "description": "oxlint and the TypeScript check; for a Plot, its recorded SQL validation."
          },
          "revision": {
            "description": "`sha256:\u003chex\u003e` of the text. Pass it as `expectedRevision` to edit_piece_source.",
            "type": "string"
          },
          "text": {
            "description": "The text the diagnostics describe, as the editor shows it (handles, not\nkeys); lines are numbered from 1. Null in edit_piece_source's answer, whose\ncaller already holds the text it wrote.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "document",
          "implementationEntityKey",
          "language",
          "revision",
          "lint"
        ],
        "type": "object"
      },
      "ParablePieceDocumentEnum": {
        "description": "Editor destinations for a Piece. SOURCE is the Piece's own source: a Page's\nor Pane's React, a Plot's SQL, a Palette's CSS; its tab is named for the\nkind (\"Pane\", \"Page\"), never \"Code\". PERCEPTION and POLICY are fields of a\nPage or Pane. PLOTS lists a Pane's Plots; PANES lists the Panes a Page\ncomposes. The editor keys drafts, its outbox and its save queue by\n(pieceKey, document), so the surface has to say which document a panel edits\nrather than leave the client to infer it from the language.",
        "enum": [
          "source",
          "perception",
          "plots",
          "panes",
          "palette",
          "policy",
          "preferences"
        ],
        "type": "string"
      },
      "ParablePieceImplementation": {
        "description": "One language's source under a Program. `programKey` is also the owning\nPiece's entityKey -- a Program has no identity of its own -- so the compose\ncore groups implementations by Piece without a second lookup, and `language`\nis a key rather than a column that can go stale.",
        "properties": {
          "code": {
            "type": "string"
          },
          "diagnostics": {
            "description": "Server verdict for this source; null means it has not been checked.",
            "nullable": true
          },
          "diagnosticsCodeHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "language": {
            "$ref": "#/components/schemas/ParablePieceLanguageEnum"
          },
          "parameters": {
            "description": "SQL default bindings, copied with the selected source revision.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "nullable": true,
            "type": "array"
          },
          "programKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceProject": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableSourceProject"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "entityKey",
          "programKey",
          "language",
          "code"
        ],
        "type": "object"
      },
      "ParablePieceKindEnum": {
        "description": "The kinds a Piece can be (PARABLE-615/641). File, Schedule and Details are\nentity tables but not Pieces, so they are absent. Deliberately NOT the same\nset as ParablePatch.entityKind, which names every entity table and\ngrows with each new one.\n\nA Preference is not a Piece: it is a setting an actor saved for a Pane. A\nPerception and a Policy are not Pieces either: they are fields of their Page\nor Pane, versioned with it.",
        "enum": [
          "page",
          "package",
          "pane",
          "plot",
          "palette"
        ],
        "type": "string"
      },
      "ParablePieceLanguageEnum": {
        "description": "Source language of a Piece's backing file. Closed set: the editor picks the\nhighlighter and the default file type from it, so a value outside this list\nhas no rendering. `code` is the explicit \"no specific language\" member --\nplain text, not a fallback invented at the call site.",
        "enum": [
          "tsx",
          "typescript",
          "perception_json",
          "yaml",
          "plot_sql",
          "css",
          "stylex_ts",
          "code"
        ],
        "type": "string"
      },
      "ParablePieceOwnerKindEnum": {
        "description": "The kinds that can own a slot row (a Plot or a Palette). The\nRust compose core keys a parent as (kind, entityKey), so an owner reference\nhas to say which table its key names; a bare UUID cannot.\n\nOnly Panes and Pages own slots. A Package is a folder and holds Packages and\nPanes only, which is the whole reason it is absent here.",
        "enum": [
          "pane",
          "page"
        ],
        "type": "string"
      },
      "ParablePiecePanelControlEnum": {
        "description": "The controls a panel header can carry.\n\nControls cross the wire as DESCRIPTORS naming a member of this enum, never as\ncomponents: a component cannot be serialized, and more importantly the server\nstays the single authority on whether a control is available. That is the same\nrule ParableProposalRecordView.availableActions already follows, and the\nreason the web-app's own copy of the action rules was deleted -- a client copy\nof a permission rule is a second answer that can only disagree with the first.\n\nThe frontend maps each member to one component and measures what fits,\nfolding the rest into an overflow menu by the descriptor's priority.",
        "enum": [
          "viewport_size",
          "search",
          "create",
          "preview_target",
          "shape_perception",
          "report_actions",
          "piece_preview",
          "requires_reporting_run"
        ],
        "type": "string"
      },
      "ParablePiecePanelControlPlacementEnum": {
        "description": "Which side of a panel header's search box a control sits on.\n\nPlacement is not measurement. It does not depend on the width of anything, so\nit is the server's to state -- the client's jurisdiction on this header is how\nmany controls FIT, which is what `inlineLimit` already says. A placement map\nliving in the renderer instead is the thing PARABLE-1727 deleted for\ndisagreeing with the branches beside it.\n\nThe pivot is the search box rather than an abstract edge because `search` is\nalready first-class on this contract (`header.search`,\n`header.searchPlaceholder`). A header that mounts no search still draws the two\nclusters in this order.\n\n`leading` and `trailing` are deliberately NOT the words. The header has a real\nleading edge -- the type label and the identity, before the slack -- and those\nnames belong to it if a control ever goes there.",
        "enum": [
          "before_search",
          "after_search"
        ],
        "type": "string"
      },
      "ParablePiecePanelControlView": {
        "description": "A control crosses the wire as a DESCRIPTOR naming an enum member, never as a\ncomponent. Partly because a component cannot be serialized, but mainly because\nthis keeps the server the single authority on availability -- the same rule\nParableProposalRecordView.availableActions follows, and the reason the\nweb-app's own copy of the action rules was deleted: a client copy of a\npermission rule is a second answer that can only disagree with the first.",
        "properties": {
          "control": {
            "$ref": "#/components/schemas/ParablePiecePanelControlEnum"
          },
          "disabledReason": {
            "description": "Shown when disabled. A control that vanishes teaches nothing; one that\nstays and says why teaches the rule.",
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "label": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "placement": {
            "$ref": "#/components/schemas/ParablePiecePanelControlPlacementEnum",
            "description": "Which side of the header's search box this control sits on.\n\nPlacement is not measurement: it does not depend on any width, so it is the\nserver's answer rather than the client's. The default keeps every control\nthat says nothing exactly where controls have always been."
          },
          "priority": {
            "description": "The order controls give way in when the header runs out of room. The server\nranks by importance; the client measures and folds the tail into an\noverflow menu. Higher survives longer.\n\nRanking is WITHIN a placement group, because the two groups fold on their own\nterms -- see `placement`.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "control",
          "label",
          "enabled",
          "priority",
          "placement"
        ],
        "type": "object"
      },
      "ParablePiecePanelCustomConfigView": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParablePiecePanelCustomKindEnum"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "ParablePiecePanelCustomKindEnum": {
        "description": "Which bespoke component a Custom panel mounts.\n\nA closed set on purpose. Custom is the escape hatch in the panel model, and an\nopen string would make it an unbounded one -- the frontend maps each member to\nexactly one component, so a member with no mapping is a compile error rather\nthan a blank panel at runtime.",
        "enum": [
          "package_members",
          "perceptions",
          "reports"
        ],
        "type": "string"
      },
      "ParablePiecePanelHeaderView": {
        "properties": {
          "controls": {
            "items": {
              "$ref": "#/components/schemas/ParablePiecePanelControlView"
            },
            "type": "array"
          },
          "hidden": {
            "type": "boolean"
          },
          "inlineIdentity": {
            "description": "Render the identity inline as a breadcrumb hop rather than as a title. This\nwas a hardcoded variant at one call site.",
            "type": "boolean"
          },
          "label": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "search": {
            "type": "boolean"
          },
          "searchPlaceholder": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "hidden",
          "inlineIdentity",
          "search",
          "controls"
        ],
        "type": "object"
      },
      "ParablePiecePanelIdeConfigView": {
        "description": "THE PIECE SURFACE: the whole right-hand region for one Piece, described as\ndata instead of decided by a branch.\n\nWhat this replaces: the old editor answered \"what does this Piece look like\"\nwith hardcoded arms on the Piece kind, and every new capability meant another\narm. A placement map existed once and\nwas deleted in PARABLE-1727 for disagreeing with those branches -- which is\nthe real lesson here, and the reason this one is COMPUTED SERVER-SIDE and\nasserted by a test that walks the rendered DOM. A map the renderer can ignore\nwill drift from it; a map the renderer is built from cannot.\n\nWHY COMPUTED AND NOT STORED. Layout is product design, not authored content:\nstoring it would write six near-identical rows per Parable that nobody edits,\nand would make \"Plots show their SQL above their results\" a per-Parable value\nthat could differ between two Parables for no reason. The parts that ARE\nauthored -- a Palette's preview target, a Page's default viewport, whether a\npanel opens folded, whether a Plot needs a report -- are columns on the Piece\nrows themselves, so they are patch-tracked for free and arrive here as INPUTS\nto the computation.",
        "properties": {
          "document": {
            "$ref": "#/components/schemas/ParablePieceDocumentEnum",
            "description": "Which of the owner's four documents this panel edits (Pieces v2). A Pane\nor Page has code, a Perception manifest, a Palette and a Policy, and the\neditor keys drafts, its outbox and the save queue by (pieceKey, document);\nthe language alone cannot tell the Palette's StyleX from the Pane's TSX\nonce both sit on one surface."
          },
          "language": {
            "$ref": "#/components/schemas/ParablePieceLanguageEnum",
            "description": "The real ParablePieceLanguageEnum, not a local union: the editor resolves\nits highlighter from this, and a second spelling of the language set is a\nsecond thing to keep in step."
          },
          "readOnly": {
            "type": "boolean"
          },
          "readOnlyReason": {
            "description": "Why it is read-only, for the editor's own banner. Null when it is not.\nRead-only KEEPS the editor mounted and disables it; that is deliberately a\ndifferent question from whether the panel exists at all, which the surface\nanswers by not listing the panel.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "language",
          "document",
          "readOnly"
        ],
        "type": "object"
      },
      "ParablePiecePanelPresentationKindEnum": {
        "description": "What a panel mounts.\n\nEach member has its own config object on ParablePiecePanelPresentationView\nrather than being a bare member, so a presentation can vary without needing a\nnew sibling every time. A read-only IDE and an editable one are one kind with\ndifferent config; they were heading for two members.\n\nNote what is NOT here: a \"results\" member. A Plot's output and a Perception's\nentries are the same rendering with different content, so results is a Sheet\nCONFIG (ParablePiecePanelSheetModeEnum) and not a fifth kind.",
        "enum": [
          "ide",
          "rendering",
          "sheet",
          "custom"
        ],
        "type": "string"
      },
      "ParablePiecePanelPresentationView": {
        "description": "Exactly one of the four config fields is non-null, chosen by `kind`.\n\npsgen has no discriminated union, so this is the shape that expresses one:\na tag plus one optional payload per arm. Go enforces the invariant on the way\nout and a test asserts it for every Piece kind, because a shape that CAN\ncarry two payloads will eventually carry two.\n\nPresentations are types with config rather than bare enum members so that a\npresentation can vary without a new sibling: a read-only IDE and an editable\none are one kind with different config, and they were heading for two members.",
        "properties": {
          "custom": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelCustomConfigView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "ide": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelIdeConfigView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "kind": {
            "$ref": "#/components/schemas/ParablePiecePanelPresentationKindEnum"
          },
          "rendering": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelRenderingConfigView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "sheet": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelSheetConfigView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "ParablePiecePanelRenderingConfigView": {
        "properties": {
          "authoredSizes": {
            "description": "The sizes this canvas actually has variants for; the picker offers these.",
            "items": {
              "$ref": "#/components/schemas/ParableViewportSizeEnum"
            },
            "type": "array"
          },
          "defaultSize": {
            "description": "The viewport to open at, from the Piece's authored defaultPreviewSize. Null\nmeans the frame's own default.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableViewportSizeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "routingScope": {
            "$ref": "#/components/schemas/ParablePieceRenderingScopeEnum"
          },
          "targetEntityKey": {
            "description": "What to render. Its own entityKey for a Page or a Pane; the Palette's\nauthored `previewTargetKey` for a Palette. Null means there is nothing to\npreview yet -- an unconfigured Palette -- and the panel shows its empty\nstate rather than a blank frame.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "routingScope",
          "authoredSizes"
        ],
        "type": "object"
      },
      "ParablePiecePanelSheetConfigView": {
        "properties": {
          "emptyBody": {
            "nullable": true,
            "type": "string"
          },
          "emptyTitle": {
            "type": "string"
          },
          "mode": {
            "$ref": "#/components/schemas/ParablePiecePanelSheetModeEnum"
          },
          "paginated": {
            "description": "Whether the server can page this content. False means the Table renders NO\nfooter and no count -- a pagination bar over data the server cannot page is\na lie, which is the rule the Table molecule already documents about itself.",
            "type": "boolean"
          }
        },
        "required": [
          "mode",
          "paginated",
          "emptyTitle"
        ],
        "type": "object"
      },
      "ParablePiecePanelSheetModeEnum": {
        "description": "What a Sheet panel is showing. Content, not presentation: every mode is a\nTable with the same empty-state contract. Sheets that share a drawer open as\nits tabs, so a Plot's Results, History and Details fold together.",
        "enum": [
          "entries",
          "results",
          "history",
          "details"
        ],
        "type": "string"
      },
      "ParablePiecePanelStateEnum": {
        "description": "Whether a panel starts open or folded to its rail.\n\nThis sits on the PANEL, not on its header. The header is a thing that can be\nhidden; being collapsed is a state of the whole panel, and putting it on the\nheader made \"a collapsed panel with a visible header\" unrepresentable -- which\nis exactly the rail affordance a collapsed panel needs.",
        "enum": [
          "open",
          "collapsed"
        ],
        "type": "string"
      },
      "ParablePiecePanelView": {
        "properties": {
          "collapsible": {
            "type": "boolean"
          },
          "defaultState": {
            "$ref": "#/components/schemas/ParablePiecePanelStateEnum",
            "description": "On the PANEL, not the header. Being collapsed is a state of the whole panel;\nputting it on the header made \"collapsed, with a visible rail\" -- exactly\nwhat a collapsed panel needs -- unrepresentable."
          },
          "header": {
            "$ref": "#/components/schemas/ParablePiecePanelHeaderView"
          },
          "key": {
            "description": "Stable per-panel key: the React-style list key, the test id, and the key\npanel state is remembered under. Stable across renders of the same kind, so\na collapsed panel stays collapsed when its content changes.",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "minSize": {
            "description": "Minimum extent along the surface's direction, in px. Null takes the frame's\ndefault.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "presentation": {
            "$ref": "#/components/schemas/ParablePiecePanelPresentationView"
          }
        },
        "required": [
          "key",
          "presentation",
          "header",
          "defaultState",
          "collapsible"
        ],
        "type": "object"
      },
      "ParablePieceReaderView": {
        "description": "One Piece that reads a Plot.",
        "properties": {
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum"
          },
          "name": {
            "type": "string"
          },
          "plotKey": {
            "description": "The Plot it reads.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "entityKey",
          "kind",
          "name",
          "plotKey"
        ],
        "type": "object"
      },
      "ParablePieceRef": {
        "description": "Stable Piece identity without revision context.",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "pieceId"
        ],
        "type": "object"
      },
      "ParablePieceRenderingScopeEnum": {
        "description": "What a rendered preview routes on.\n\nA Page owns a route, so its preview routes on the viewport itself; a Pane is a\nbuilding block referenced from elsewhere, so its preview routes on its own\ncontainer. The distinction is addressing, not substance -- both mount the same\nrenderer over the same source.",
        "enum": [
          "page",
          "pane"
        ],
        "type": "string"
      },
      "ParablePieceRevisionRef": {
        "description": "Exact revision of a currently executable Piece kind.",
        "discriminator": {
          "mapping": {
            "package": "#/components/schemas/ParablePackageRevisionRef",
            "page": "#/components/schemas/ParablePageRevisionRef",
            "palette": "#/components/schemas/ParablePaletteRevisionRef",
            "pane": "#/components/schemas/ParablePaneRevisionRef",
            "plot": "#/components/schemas/ParablePlotRevisionRef"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ParablePageRevisionRef"
          },
          {
            "$ref": "#/components/schemas/ParablePaneRevisionRef"
          },
          {
            "$ref": "#/components/schemas/ParablePackageRevisionRef"
          },
          {
            "$ref": "#/components/schemas/ParablePlotRevisionRef"
          },
          {
            "$ref": "#/components/schemas/ParablePaletteRevisionRef"
          }
        ]
      },
      "ParablePieceSourceEdit": {
        "additionalProperties": false,
        "description": "One exact replacement inside a document.",
        "properties": {
          "newText": {
            "maxLength": 65536,
            "type": "string"
          },
          "oldText": {
            "description": "Text that occurs exactly once in the document as the edits before this one leave it.",
            "maxLength": 65536,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "oldText",
          "newText"
        ],
        "type": "object"
      },
      "ParablePieceSourceRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableSourceRefKindEnum"
          },
          "piece": {
            "$ref": "#/components/schemas/ParablePieceRef"
          }
        },
        "required": [
          "kind",
          "piece"
        ],
        "type": "object"
      },
      "ParablePieceSurfaceDirectionEnum": {
        "description": "How a Piece's panels stack in its surface.\n\nThe surface holds a flat ordered list of panels and one direction, rather than\na primary/secondary pair. A fixed two-slot shape cannot say \"three stacked\" or\n\"two side by side\", and every kind that wanted a third region had to grow a\nbranch instead of a row.",
        "enum": [
          "vertical",
          "horizontal"
        ],
        "type": "string"
      },
      "ParablePieceSurfaceEntryView": {
        "description": "One Piece's surface, paired with the Piece it belongs to.\n\nA typed pair rather than a keyed map: psgen can express an array of a class\nbut not a keyed object, and reaching for Generic.JSON to get a map would put\nan unvalidated shape inside a validated one -- the schema-first rule the root\nCLAUDE.md states, and the reason no other read-model field is a blob.",
        "properties": {
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "surface": {
            "$ref": "#/components/schemas/ParablePieceSurfaceView"
          }
        },
        "required": [
          "entityKey",
          "surface"
        ],
        "type": "object"
      },
      "ParablePieceSurfaceView": {
        "properties": {
          "direction": {
            "$ref": "#/components/schemas/ParablePieceSurfaceDirectionEnum"
          },
          "panels": {
            "description": "A flat ordered list, not primary/secondary. A Piece may want two side by\nside or three stacked, and a fixed two-slot shape cannot say either; every\nkind that wanted a third region had to grow a branch instead of a row.",
            "items": {
              "$ref": "#/components/schemas/ParablePiecePanelView"
            },
            "type": "array"
          },
          "pieceKind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum",
            "description": "The Piece kind this surface was computed for. Carried so the renderer can\nassert it got the surface it asked for rather than trusting call order."
          },
          "readBy": {
            "description": "The Pieces outside this one that read its Plots in code: for a Plot, the\nPages and Panes that declare its Pane and call it; for a Pane, the readers\nof any of its Plots. A Plot that only SQL reads is not listed. Deleting a\nPiece that a listed reader reads is refused, and the delete control names\nthese readers.",
            "items": {
              "$ref": "#/components/schemas/ParablePieceReaderView"
            },
            "type": "array"
          }
        },
        "required": [
          "pieceKind",
          "direction",
          "panels",
          "readBy"
        ],
        "type": "object"
      },
      "ParablePingAnswer": {
        "description": "One person's answer to one question. Selections, free words, and pictures are\nindependent: a person may choose nothing and only write, choose and annotate,\nor say plainly that the question cannot be answered yet.",
        "properties": {
          "attachments": {
            "items": {
              "description": "Generic file metadata",
              "type": "object"
            },
            "minItems": 0,
            "type": "array"
          },
          "body": {
            "description": "Free words. Always offered, whatever the modality.",
            "maxLength": 65536,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "needsMoreInformation": {
            "description": "Explicit \"I need more information\" rather than an empty answer.",
            "type": "boolean"
          },
          "order": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "purposeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "selections": {
            "items": {
              "$ref": "#/components/schemas/ParablePingAnswerSelection"
            },
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "purposeId",
          "order",
          "selections",
          "needsMoreInformation",
          "attachments"
        ],
        "type": "object"
      },
      "ParablePingAnswerInput": {
        "description": "One answer to one question. Choosing, writing, and attaching are independent.",
        "properties": {
          "attachments": {
            "items": {
              "description": "Generic file metadata",
              "type": "object"
            },
            "maxItems": 20,
            "minItems": 0,
            "type": "array"
          },
          "body": {
            "description": "Markdown text",
            "maxLength": 65536,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "needsMoreInformation": {
            "type": "boolean"
          },
          "purposeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "selections": {
            "items": {
              "$ref": "#/components/schemas/ParablePingAnswerSelectionInput"
            },
            "maxItems": 200,
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "purposeId",
          "selections",
          "needsMoreInformation",
          "attachments"
        ],
        "type": "object"
      },
      "ParablePingAnswerSelection": {
        "description": "One chosen Possibility inside one answer. rank orders a ranked answer and\npreserves the order a person picked in every other modality, so a question\ncan change modality without rewriting stored answers.",
        "properties": {
          "note": {
            "description": "The person's own words about this one choice, beside the asker's summary.",
            "maxLength": 4096,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "possibilityId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rank": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "possibilityId",
          "rank"
        ],
        "type": "object"
      },
      "ParablePingAnswerSelectionInput": {
        "properties": {
          "note": {
            "description": "The person's own words about this one choice.",
            "maxLength": 4096,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "possibilityId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rank": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "possibilityId",
          "rank"
        ],
        "type": "object"
      },
      "ParablePlatformReaderView": {
        "description": "A Parable whose published Version reads a Platform Parable's Plots\n(PARABLE-6986). While one exists, the Platform Parable keeps Platform on and\ncannot be archived or deleted.",
        "properties": {
          "name": {
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "workspaces": {
            "description": "How many Workspaces' published Versions of it read the Platform Parable.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "parableId",
          "name",
          "workspaces"
        ],
        "type": "object"
      },
      "ParablePlot": {
        "properties": {
          "deletedOnRef": {
            "type": "boolean"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "handlePinned": {
            "type": "boolean"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParablePlotKindEnum"
          },
          "maxCost": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotCostCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxExternalCalls": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotExternalCallsCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxRuntime": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotRuntimeCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "name": {
            "type": "string"
          },
          "order": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "nullable": true,
            "type": "object"
          },
          "outputSchemaUpdatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "ownerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ownerKind": {
            "$ref": "#/components/schemas/ParablePieceOwnerKindEnum",
            "description": "The Pane this Plot is a slot of. `ownerKind` is always `pane` for a Plot\n(a Page has no SQL); it is carried so every slot row reads alike."
          },
          "panelDefaultState": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePiecePanelStateEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "publishedSql": {
            "description": "SQL text",
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "requiresReportingRun": {
            "type": "boolean"
          },
          "slug": {
            "description": "Engine and catalog fields, projected because a Workspace reading a\npublished Plot needs to know how it materializes -- this is what the\nhand-written TenantParablePlot exposed before the read surface became one\ngenerated package (PARABLE-1434 / EDR-0084). A @source projection lists\nfields explicitly, so adding them to the web-db entity is not enough.\n\nNullable on the wire only: web-db.ParablePlot.slug is NOT NULL. A new Plot\nmay omit slug; upsertPlot seeds it from the handle before CreateOne. Empty\nstring is still invalid Parable.CatalogSlug.\n\nParable.CatalogSlug, tracking the source column since PARABLE-3249 narrowed\nit from Identity.Slug. The projection must not stay wider than its source:\na producer that sent the hyphenated `tool-costs` this field used to admit\nwould be writing a value the catalog registers as `tool_costs`, so the\nstored address and the registered name would disagree.",
            "maxLength": 255,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "entityKey",
          "deletedOnRef",
          "ownerKind",
          "ownerKey",
          "order",
          "name",
          "handle",
          "handlePinned",
          "requiresReportingRun",
          "kind"
        ],
        "type": "object"
      },
      "ParablePlotCostCap": {
        "properties": {
          "value": {
            "description": "Monetary amount in smallest currency unit (e.g., cents for USD)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "value"
        ],
        "type": "object"
      },
      "ParablePlotDataTypes": {
        "description": "Authoring .d.ts payload. psgen has no text/plain response, so the file\ntravels as a JSON string field.",
        "properties": {
          "cacheControl": {
            "description": "HTTP Cache-Control value for this representation; always `no-store`.",
            "type": "string"
          },
          "etag": {
            "description": "Always empty: current authorization governs every read, so the route sets no validator.",
            "type": "string"
          },
          "source": {
            "description": "Deterministic .d.ts module from parableplotsdata.Generate: row types and Plots accessors.",
            "type": "string"
          }
        },
        "required": [
          "source",
          "etag",
          "cacheControl"
        ],
        "type": "object"
      },
      "ParablePlotDependencyInput": {
        "properties": {
          "upstreamParableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "upstreamPlotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "upstreamParableId",
          "upstreamPlotId"
        ],
        "type": "object"
      },
      "ParablePlotDependencyScopeEnum": {
        "description": "The replaceable edge set a Plot dependency belongs to.",
        "enum": [
          "draft",
          "published"
        ],
        "type": "string"
      },
      "ParablePlotDependencyView": {
        "properties": {
          "downstreamParableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "downstreamPlotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParablePlotDependencyScopeEnum"
          },
          "scopeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "upstreamParableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "upstreamPlotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "downstreamParableId",
          "downstreamPlotId",
          "scope",
          "scopeId",
          "upstreamParableId",
          "upstreamPlotId"
        ],
        "type": "object"
      },
      "ParablePlotExternalCallsCap": {
        "description": "Nullable JSON wrappers for the three ParablePlot budget caps (PARABLE-1690).\npsgen emits a nullable numeric scalar as a bare Go number, which cannot tell\nSQL NULL (no cap) from zero; the wrapper keeps presence. They live here, in\nthe General package under web-db, because a General schema may not reference\nDB types, web-shared-types sits above this package, and web-db may depend on\na General package the way it depends on enums.",
        "properties": {
          "value": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "value"
        ],
        "type": "object"
      },
      "ParablePlotKindEnum": {
        "description": "Implementation subtype for a product Plot (PARABLE-1434). First value is SQL\nagainst pools; pairs with Chart language plot_sql. Extensible later.",
        "enum": [
          "sql"
        ],
        "type": "string"
      },
      "ParablePlotOutputReference": {
        "description": "A named Plot's logical output, across its definition and Report versions.",
        "properties": {
          "parableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "parableKey",
          "plotKey"
        ],
        "type": "object"
      },
      "ParablePlotRevisionRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          }
        },
        "required": [
          "kind",
          "pieceId",
          "revision"
        ],
        "type": "object"
      },
      "ParablePlotRunSummaryView": {
        "properties": {
          "errorCode": {
            "maxLength": 256,
            "nullable": true,
            "type": "string"
          },
          "errorMessage": {
            "maxLength": 2048,
            "nullable": true,
            "type": "string"
          },
          "lastSuccessAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "latestQueryRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "materializedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "scheduledFireAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "sealedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceUpdatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "spentCalls": {
            "format": "double",
            "type": "number"
          },
          "spentCost": {
            "format": "double",
            "type": "number"
          },
          "status": {
            "$ref": "#/components/schemas/QueryRunStatus"
          }
        },
        "required": [
          "latestQueryRunId",
          "status",
          "sourceUpdatedAt",
          "spentCost",
          "spentCalls"
        ],
        "type": "object"
      },
      "ParablePlotRuntimeCap": {
        "properties": {
          "value": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "value"
        ],
        "type": "object"
      },
      "ParablePlottedPathPrecomputeEnum": {
        "description": "When the platform writes a Pane's Plotted Path ahead of its first reader\n(PARABLE-5951), as the Pane's Perception asks with `@plottedPath`:\npublish  As each Version is published.\nreport   As each Report run of a Version completes, so a Parable read\nmostly from its Refreshes has it written before its readers come.\nA Pane that asks for neither has its Plotted Path written the first time a\nreader opens it, and kept from then on.",
        "enum": [
          "publish",
          "report"
        ],
        "type": "string"
      },
      "ParablePolicies": {
        "additionalProperties": false,
        "description": "Policies govern a Pane's saved values and contained parts. A Plot is its\nlogic, not another Pane. The server classifies a stored target; a request\ncannot gain edit.preferences authority over SQL/React/CSS/Policies merely\nby using the generic Preference API. Required root actions never inherit.\nCreation uses existing destination authority; a candidate cannot approve\nitself. Replacing or reattaching Policies checks prior edit.policies and\nattachment revisions. Required parts bootstrap/retire atomically with their\nPane under enclosing authoring authority, never by deleting/recreating a\nPolicies object independently. Collection configuration follows its member\ntarget; permission to add a member does not grant edits to that collection.\nview.plots governs saved SQL source inspection, not permission to consume SQL\nresults. Output policies use view.preferences and the filter Policies that cover them;\nSQL outputs stay read-only. Rendering allowed React and CSS necessarily\ndelivers executable code/styles, so source-inspection restrictions are not\nsecrecy guarantees for those delivered assets.",
        "properties": {
          "create": {
            "$ref": "#/components/schemas/ParablePolicyCollectionGrants"
          },
          "delete": {
            "$ref": "#/components/schemas/ParablePolicyCollectionGrants"
          },
          "edit": {
            "$ref": "#/components/schemas/ParablePolicyContentGrants"
          },
          "filterPolicies": {
            "description": "Filter Policies over the Plots this Page or Pane reaches (PARABLE-5423). Absent or empty filters nothing.",
            "items": {
              "$ref": "#/components/schemas/ParableFilterPolicy"
            },
            "maxItems": 10,
            "nullable": true,
            "type": "array"
          },
          "filters": {
            "description": "Retired (PARABLE-5701): always empty. A Page's or Pane's row filters are\nfilter Policies now (`filterPolicies` with `covers: own`). The key stays,\nempty, because every published Version's content hash and history image\nincludes it.",
            "items": {
              "description": "SQL text",
              "minLength": 1,
              "pattern": "^[\\s\\S]*$",
              "type": "string"
            },
            "maxItems": 0,
            "type": "array"
          },
          "view": {
            "$ref": "#/components/schemas/ParablePolicyContentGrants"
          }
        },
        "required": [
          "view",
          "create",
          "edit",
          "delete",
          "filters"
        ],
        "type": "object"
      },
      "ParablePolicyActionEnum": {
        "description": "Closed application operations. Unknown operations never fall back to viewing.",
        "enum": [
          "view",
          "create",
          "edit",
          "delete"
        ],
        "type": "string"
      },
      "ParablePolicyActorRef": {
        "additionalProperties": false,
        "description": "One person or Workspace role a grant names (PARABLE-5628). Kinds other than\nperson and role are refused. A role names the people who hold it in the\nline's Workspace: an active membership of an undeleted account, roles that\nare not soft-deleted, and no inheritance from parent roles.",
        "properties": {
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableActorKindEnum"
          }
        },
        "required": [
          "kind",
          "id"
        ],
        "type": "object"
      },
      "ParablePolicyAdmission": {
        "additionalProperties": false,
        "description": "Why a reader may take one action on one part: the grant that admitted them\nand how. `level` is the lowest level the grant lists that the reader's seat\nmeets (by participation); `roleId` and `roleName` name the Role (by role).\n`setting` names the This Parable setting whose value was the grant, when one\nwas; its value is not disclosed.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/ParablePolicyActionEnum"
          },
          "by": {
            "$ref": "#/components/schemas/ParablePolicyAdmissionEnum"
          },
          "level": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableParticipantPermissionEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "roleId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "roleName": {
            "nullable": true,
            "type": "string"
          },
          "setting": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicySettingRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "target": {
            "$ref": "#/components/schemas/ParablePolicyTargetEnum"
          }
        },
        "required": [
          "action",
          "target",
          "by"
        ],
        "type": "object"
      },
      "ParablePolicyAdmissionEnum": {
        "description": "How a Policy grant admitted a reader: by their participation level, by\nnaming them, or by naming a Role they hold (PARABLE-5628). A grant read\nfrom a setting (PARABLE-5631) admits the same three ways.",
        "enum": [
          "participation",
          "person",
          "role"
        ],
        "type": "string"
      },
      "ParablePolicyAuthorityRevision": {
        "description": "Revisions observed while resolving current authority.",
        "properties": {
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "revision"
        ],
        "type": "object"
      },
      "ParablePolicyCapabilities": {
        "description": "Fixed decisions shared by API and renderer; never accepted as write authority.",
        "properties": {
          "conditional": {
            "description": "True means execution may still evaluate conditions against the actual candidate/data:\na filter Policy covers this Page or Pane and does not let this reader read every row\n(Pane resolution decides it with web-db). It does not ask whether the Pane's Plots\nread Provider data; the Query Layer narrows only those that do.",
            "type": "boolean"
          },
          "create": {
            "$ref": "#/components/schemas/ParablePolicyTargetCapabilities"
          },
          "delete": {
            "$ref": "#/components/schemas/ParablePolicyTargetCapabilities"
          },
          "edit": {
            "$ref": "#/components/schemas/ParablePolicyTargetCapabilities"
          },
          "view": {
            "$ref": "#/components/schemas/ParablePolicyTargetCapabilities"
          },
          "writeConditional": {
            "description": "True means a filter Policy for create, edit or delete binds this reader's writes of\nthis Pane's shared settings: the setting write check applies its predicates, so a\nwrite may be refused by its value. Never true for the Primary. Pane resolution\ndecides it with web-db from the predicates that check reads.",
            "type": "boolean"
          }
        },
        "required": [
          "view",
          "create",
          "edit",
          "delete",
          "conditional",
          "writeConditional"
        ],
        "type": "object"
      },
      "ParablePolicyCollectionGrants": {
        "additionalProperties": false,
        "description": "Live instances have collection grants; required definition parts follow their owner.",
        "properties": {
          "palette": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "pane": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "plots": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "preferences": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "type": "object"
      },
      "ParablePolicyContentGrants": {
        "additionalProperties": false,
        "description": "Independent grants. An absent/null target denies, with no inheritance.",
        "properties": {
          "palette": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "pane": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "perception": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "plots": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "policies": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "preferences": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyGrant"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "type": "object"
      },
      "ParablePolicyGrant": {
        "additionalProperties": false,
        "description": "An extensible, fixed-schema selector; unrecognized conditions are refused.\nIt admits anyone a listed participation level matches, anyone it names by\nperson, and anyone holding a role it names. Every action still needs a seat\non the line, so a named person without one reaches nothing.",
        "properties": {
          "actors": {
            "description": "People and Workspace roles this grant also admits. Absent or empty names no one.",
            "items": {
              "$ref": "#/components/schemas/ParablePolicyActorRef"
            },
            "maxItems": 50,
            "nullable": true,
            "type": "array"
          },
          "fromSetting": {
            "description": "A setting whose value replaces participantsWith and actors while it holds\na valid grant that names no setting itself. A missing or invalid setting\nleaves the grant's own. Changing a setting a Policy names needs\nedit.policies on the Page or Pane that holds the Policy.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicySettingRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "participantsWith": {
            "$ref": "#/components/schemas/ParablePolicyParticipantsWith"
          }
        },
        "required": [
          "participantsWith"
        ],
        "type": "object"
      },
      "ParablePolicyHealthEnum": {
        "description": "How the Policies of a Parable are holding up, in the ref or Deployment being viewed.\nDerived from the findings and changes that exist right now, never stored: a health\ncolumn would be one write away from disagreeing with the rows it summarises. It says\nnothing about the publishing lifecycle -- a published Parable can be BREAKING and a\ndraft can be CLEAR.",
        "enum": [
          "clear",
          "attention",
          "breaking"
        ],
        "type": "string"
      },
      "ParablePolicyParticipantsWith": {
        "additionalProperties": false,
        "description": "Match any covered Parable participant permission. An empty array grants nobody.",
        "properties": {
          "participantPermission": {
            "items": {
              "$ref": "#/components/schemas/ParableParticipantPermissionEnum"
            },
            "maxItems": 4,
            "type": "array"
          }
        },
        "required": [
          "participantPermission"
        ],
        "type": "object"
      },
      "ParablePolicySettingRef": {
        "additionalProperties": false,
        "description": "A This Parable setting a grant takes its value from (PARABLE-5631): the\nWorkspace's setting on this line under handle, owned by the Page or Pane\npaneKey names, as the settings API names them.",
        "properties": {
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "paneKey",
          "handle"
        ],
        "type": "object"
      },
      "ParablePolicyTargetCapabilities": {
        "description": "Participant eligibility, not a guarantee that arbitrary candidate values pass filters.",
        "properties": {
          "palette": {
            "type": "boolean"
          },
          "pane": {
            "type": "boolean"
          },
          "perception": {
            "type": "boolean"
          },
          "plots": {
            "type": "boolean"
          },
          "policies": {
            "type": "boolean"
          },
          "preferences": {
            "type": "boolean"
          }
        },
        "required": [
          "preferences",
          "pane",
          "perception",
          "plots",
          "palette",
          "policies"
        ],
        "type": "object"
      },
      "ParablePolicyTargetEnum": {
        "description": "Semantic contents of a Pane; shared Preference storage does not determine authority.",
        "enum": [
          "preferences",
          "pane",
          "perception",
          "plots",
          "palette",
          "policies"
        ],
        "type": "string"
      },
      "ParablePoolEntry": {
        "description": "One referenceable Plot in the parables pool, addressed as\nparables.{parableSlug}.{plotSlug} (spec 0084 \"The catalog snapshot\").",
        "properties": {
          "entityKey": {
            "description": "Null when the entry is a client-spliced unsaved draft. Draft splicing is the\nONLY client-side assembly the spec allows (spec 0084 \"The catalog snapshot\"),\nan unsaved draft has never been persisted so it has no key, and this null is\nwhat PV_REF_008 fires on. A required key would force the editor -- the\nsurface the whole wasm design exists for -- to fabricate a UUID that then\nflows into reference-drift comparisons.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "fields": {
            "description": "Columns from the Plot's outputSchema. Empty when schemaStatus is UNKNOWN.\n\nParablePoolField, NOT SemanticCatalogField -- see the type's own comment for\nwhy (D-16, scalar G1). `hidden` and `poorPruning` are absent because they\nare provider-STORAGE concepts (quarantine envelope columns, data-skipping\npruning) with no meaning for a column a query derived a moment ago.\n\nA plain array, so rustgen emits a bare `Vec\u003cParablePoolField\u003e` with NO\n#[serde(default)] (only the rename). A producer must therefore SEND the key\nas [] -- omitting it is a Rust deserialization failure, not an empty list.\nEvery producer is generated, so every producer emits it; the Phase 4\nround-trip test asserts both directions (emission, and Err on omission) so a\nfuture hand-rolled producer fails loudly instead of silently.\nNullable\u003cParablePoolField[]\u003e was the alternative and is worse: it would\nmake \"absent\" and \"empty\" both legal and reintroduce the fields.length\nambiguity schemaStatus exists to kill.",
            "items": {
              "$ref": "#/components/schemas/ParablePoolField"
            },
            "type": "array"
          },
          "outputSchemaUpdatedAt": {
            "description": "When the schema was last derived, so staleness is visible.\n\nTWO null cases, not one (D-22, adversarial C14). Null when schemaStatus is\nUNKNOWN, because nothing has ever been derived; AND null for a\nclient-spliced unsaved draft, which is DERIVED but has never been persisted,\nso no derivation timestamp exists for it and none ever will while it is a\ndraft. Do not read \"schemaStatus == DERIVED\" as \"this key is present\".",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "parableSlug": {
            "description": "The IMMUTABLE parable slug: ProductParable.slug, read straight off the row.\n\nA PRODUCER NORMALIZES NOTHING (PARABLE-3264). This field used to instruct\nproducers to fold the mutable template handle into slug form themselves,\nwhile nothing in the repo performed that fold and Identity.Slug's normalize\nwas the identity function -- so the instruction could not be followed and\nthe only way to follow it was to invent a fifth ad-hoc identifier\ntransform. PARABLE-2688 landed ProductParable.slug, so the value now exists\nas a sealed column and there is nothing left to derive at send time.\n\nWhere a derivation IS genuinely needed -- seeding the column at create --\nParable.CatalogSlug's normalize is the one owner of it\n(utils/scalar-lib/core/src/scalars/parable_catalog_slug.rs), and it is what\nweb-api calls: `Q3 Revenue by Region` seals as `q3_revenue_by_region`, once,\nat create. It LOWERCASES a camelCase handle rather than splitting it, so\n`revenueForecast` seals as `revenueforecast` -- pinned by the v2 parity\nvectors, and worth stating because the other reading is the intuitive one.\n\nNORMAL FORM: Parable.CatalogSlug, and the slug IS the SQL identifier\n(PARABLE-3249). This field used to be Identity.Slug, which admits hyphens,\nand callers were told to compare against PlotTableReference.schemaName only\nafter folding `-` into `_`. That fold no longer exists as a separate step:\nthe alphabet here is the fixed-point set of the engine's identifier\nsanitizer, so `parableSlug` and the registered schema name are the same\nstring. Compare them directly.",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "plotSlug": {
            "description": "The Plot half of the address, and the same story: Parable.CatalogSlug since\nPARABLE-3249, so plotSlug equals PlotTableReference.tableName byte for byte\nand a direct comparison is correct. A hyphenated slug can no longer reach\nhere, which is what removes the false unknown-table diagnostic\nplot-validator-rs would otherwise produce for a Plot that exists\n(PARABLE-3221).",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "schemaStatus": {
            "$ref": "#/components/schemas/CatalogParableSchemaStatusEnum",
            "description": "Read this BEFORE fields. An UNKNOWN entry and a zero-column table both\nserialize `fields: []`; branching on fields.length treats a Plot that has\nnever derived a schema as an empty table and emits a wrong \"unknown column\"\ninstead of the specified underivable diagnostic."
          }
        },
        "required": [
          "parableSlug",
          "plotSlug",
          "schemaStatus",
          "fields"
        ],
        "type": "object"
      },
      "ParablePoolField": {
        "description": "One output column of a referenceable Plot.\n\nNOT SemanticCatalogField, deliberately (D-16, scalar G1). That type is the\nprovider pool's column shape and its `name` is Identity.Name, whose\nmin_length of 2 is enforced in generated Go\n(SemanticCatalogField.Validate in dist/types/go/query-layer/types.go) and\ngenerated TypeScript (validators/scalars/identity_name.ts). Cited by SYMBOL,\nnot by line: dist/ is regenerated output and its line numbers go stale\nsilently.\nA Plot's output columns are author-controlled SQL aliases and spec 0084:364\nmakes an odd output name a WARNING, not an error, so `SELECT count(*) AS n`\npublishes normally and puts a one-character column into outputSchema. Reusing\nSemanticCatalogField would make any consumer running the generated validator\nover the PARABLE-2703 snapshot reject the ENTIRE payload because one Plot has\na short column name -- against this contract's own \"never produces a false\nerror\" posture.\n\nThis is NOT a mirror of SemanticCatalogField. It is the repo's existing answer\nto \"columns of a Plot\": PlotDataManifestColumn (PR #5841 / PARABLE-2699, now\non main) is { name, scalarRef, primitive, sortable }. This field carries\n`nullable` instead of `sortable`. Validation needs nullability to reject\n`IS NULL` on a NOT NULL column; the Plot data path needs sortability. Do\nnot merge the two types -- they evolve independently. Two pools, two\ncolumn shapes, because the two pools carry two different type domains.",
        "properties": {
          "name": {
            "description": "The output column name AS DERIVED from the Plot's SQL. A bare string for\nexactly the reason PlotTableReference.tableName is one: it is\nauthor-controlled text, and a validated scalar rejects the payload before\nthe diagnostic about it can be delivered. A one-character alias is legal\nhere and would fail Identity.Name.",
            "type": "string"
          },
          "nullable": {
            "type": "boolean"
          },
          "primitive": {
            "description": "The column's psgen PRIMITIVE, not an Arrow type, and the divergence from\nSemanticCatalogField.arrowType is real rather than sloppy. A provider\ncolumn's type is a served Arrow DataType Display rendering, because the\nphysical table exists. A Plot column's type comes from its derived\nParableSchema, which is psgen primitives -- `String`, `Int`, `Float`,\n`Bool`, `Type` (PrimitiveKind::dsl_name,\nutils/scalar-lib/core/src/registry.rs:7-26) -- and has NO Arrow type until\nthe query executes. There is no bridge between the two domains; do not\nassume one exists. Written for PARABLE-2691, which has landed and honoured\nit: services/pkg/plot-validator-rs declares no Arrow dependency at all, and\nscripts/ci/check_plot_validator_deps.py fails the build if one appears. The\nnote stays for whoever fills the typer (spec 0084 Phase 2).\n\nParable.Primitive, not a bare string and not a sixth enum. An enum would be\na mirror of scalar-lib's PrimitiveKind in a schema that does not own that\nvocabulary, and would drift the first time the Rust enum gains a member.\nThe scalar is the third option PARABLE-2687 skipped: a directive-only\ncanonical-name scalar, sibling of Parable.Scalar, whose closed five-member\ndomain lives beside the enum it spells and is bound to it by\n`the_primitive_scalar_pattern_matches_every_primitive_kind`. It validates at\nevery generated boundary, so a producer typo is a validation error here\nrather than degraded typing at the validator's typer (PARABLE-3279).",
            "maxLength": 16,
            "minLength": 3,
            "pattern": "^(String|Int|Float|Bool|Type)$",
            "type": "string"
          },
          "scalarRef": {
            "description": "Canonical name of the column's semantic scalar, same encoding and same\nvalue space as SemanticCatalogField.scalarRef; null when the derived column\ncarries no semantic scalar.",
            "maxLength": 128,
            "minLength": 3,
            "nullable": true,
            "pattern": "^[A-Z][A-Za-z0-9]*\\.[A-Z][A-Za-z0-9]*$",
            "type": "string"
          }
        },
        "required": [
          "name",
          "primitive",
          "nullable"
        ],
        "type": "object"
      },
      "ParablePossibility": {
        "properties": {
          "arguments": {
            "items": {
              "$ref": "#/components/schemas/ParablePossibilityArgument"
            },
            "type": "array"
          },
          "consultPurposeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "responsibilities": {
            "items": {
              "$ref": "#/components/schemas/ParableActorAssignment"
            },
            "type": "array"
          },
          "summary": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "problemId",
          "consultPurposeId",
          "summary",
          "arguments",
          "responsibilities"
        ],
        "type": "object"
      },
      "ParablePossibilityArgument": {
        "description": "Pros and Cons are ordered structural values, not independent identities.",
        "properties": {
          "body": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "order": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "polarity": {
            "$ref": "#/components/schemas/PossibilityArgumentPolarityEnum"
          }
        },
        "required": [
          "polarity",
          "body",
          "order"
        ],
        "type": "object"
      },
      "ParablePreferenceActorKindEnum": {
        "description": "Whose values a Preference row holds (PARABLE-5635): the scope a person\nchooses when they save a Personalized Perception.\nperson     Me: the signed-in person's own setting, theirs alone.\nworkspace  This Parable: the setting shared in the Workspace, keyed by the\nWorkspace's id.\ngroup      A group's setting: a group at any level of the Parable's own\nhierarchy (a Division, a Department, a Team, or whatever\nlevels the Workspace's set names), keyed by the id a Plot of\nthe Parable gives the group, such as a category's id. Read and written like This Parable's,\nunder the owning Pane's preferences grants and its edit\nfilters; nothing depends on the level.\nplatform   The platform's own value on a Pane (PARABLE-5951), such as\nPlotted Path's stored explanation, keyed by the Version it\nexplains: actor_id is that Version's id. Only the platform\nwrites it, through its own Store methods, never SaveSetting;\nanyone who may view the Pane reads it through the feature\nthat owns it. Settings lists, Plot SQL (workspace.preferences)\nand Report captures never see it.\nThis is not the actor kind tree (ParableActorKindEnum). A group is no actor:\nit holds no seat, no grant names it and it authors nothing, as PD5 decided.\nIt is only whose values a row holds. `team` was the kind's first name and\nread as one fixed level (PARABLE-5635, 2026-10-09). The column is text with its own CHECK,\nchk_parable_actor_preference_actor_kind, which mirrors this enum.",
        "enum": [
          "person",
          "workspace",
          "group",
          "platform"
        ],
        "type": "string"
      },
      "ParablePreferenceHistoryView": {
        "properties": {
          "operation": {
            "type": "string"
          },
          "preferenceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "recordedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "value": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "writtenBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "preferenceId",
          "revision",
          "operation",
          "value",
          "recordedAt",
          "writtenBy"
        ],
        "type": "object"
      },
      "ParablePreferenceModeEnum": {
        "description": "How a Preference changes (PARABLE-5721). A Page's or Pane's Perception\ndeclares it on its `preferences` with `Live\u003cT\u003e` or `Versioned\u003cT\u003e` from\n`parable/foundation`; a Perception that wraps neither is Live.\nlive       A save applies at once, to every Version.\nversioned  A save changes the Parable: it publishes a new Version through\nthe publish gate when the saver may publish, lands as proposed\nChanges when they may change the setting but not publish, and\nis refused otherwise. A reader of a Version reads that\nVersion's value.",
        "enum": [
          "live",
          "versioned"
        ],
        "type": "string"
      },
      "ParablePreferenceModes": {
        "description": "How a Page's or Pane's Preferences change (PARABLE-5721), compiled from its\nPerception's `preferences`: `Versioned\u003cT\u003e` or `Live\u003cT\u003e` from\n`parable/foundation`. One mode covers every handle of the Page or Pane.",
        "properties": {
          "mode": {
            "$ref": "#/components/schemas/ParablePreferenceModeEnum"
          },
          "plotSql": {
            "description": "True when the Perception declares `Versioned\u003cPlotSql\u003e`: each setting is\nthe SQL of one of the Pane's own Plots, under that Plot's handle.",
            "type": "boolean"
          }
        },
        "required": [
          "mode",
          "plotSql"
        ],
        "type": "object"
      },
      "ParablePreferencePublishedVersion": {
        "description": "The Version a Versioned setting's write published. Its label is\nv{versionMajor}.{versionMinor}, with +{versionLocal} on a line that follows\nan upstream.",
        "properties": {
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "message": {
            "nullable": true,
            "type": "string"
          },
          "versionLocal": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "versionMajor": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "versionMinor": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "versionMajor",
          "versionMinor",
          "versionLocal"
        ],
        "type": "object"
      },
      "ParablePreferenceSaveOutcomeEnum": {
        "description": "What a Preference save or delete did (PARABLE-5721).\nlive       A Live setting: the value applies now, to every Version.\npublished  A Versioned setting: the change was published as a new Version.\nproposed   A Versioned setting: the change is in a set of Changes,\nproposed for a Publishing participant to publish.\nsaved      A Versioned setting on a Personal Parable, which has no\nVersions: the change is saved to the Parable.",
        "enum": [
          "live",
          "published",
          "proposed",
          "saved"
        ],
        "type": "string"
      },
      "ParablePreferenceView": {
        "description": "Settings: values an actor saved for a Pane. A setting belongs to the\nsigned-in person (shown as Me), or, when shared, to the Parable in this\nWorkspace (shown as This Parable) or to one group at any level of the\nParable's hierarchy (PARABLE-5635). The owning Pane's current Policies\ndecide shared reads (view.preferences), creates (create.preferences),\nreplacements (edit.preferences), and deletes (delete.preferences)\nseparately, This Parable's and every group's alike. A person's setting is\ntheirs alone.",
        "properties": {
          "actorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "actorKind": {
            "$ref": "#/components/schemas/ParablePreferenceActorKindEnum"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "mode": {
            "$ref": "#/components/schemas/ParablePreferenceModeEnum",
            "description": "How the setting changes (PARABLE-5721): Live applies at once to every\nVersion; Versioned changes only through a Version, and reads the value of\nthe Version being read."
          },
          "name": {
            "nullable": true,
            "type": "string"
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "Who last set the value, and their name when the reader may see it.",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "updatedByName": {
            "nullable": true,
            "type": "string"
          },
          "value": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          }
        },
        "required": [
          "id",
          "paneKey",
          "handle",
          "actorKind",
          "actorId",
          "value",
          "revision",
          "updatedAt",
          "updatedBy",
          "mode"
        ],
        "type": "object"
      },
      "ParablePreferenceWriteResult": {
        "description": "Mutations return identity/revision, not a read that could bypass view rules.",
        "properties": {
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outcome": {
            "$ref": "#/components/schemas/ParablePreferenceSaveOutcomeEnum",
            "description": "What the write did (PARABLE-5721): applied live, published a Version,\nproposed Changes, or saved a Personal Parable."
          },
          "proposalId": {
            "description": "The set of Changes a Versioned write opened: published, or proposed for\na Publishing participant.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "version": {
            "description": "The Version a Versioned write published.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePreferencePublishedVersion"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "id",
          "revision",
          "outcome"
        ],
        "type": "object"
      },
      "ParablePrepareChoiceView": {
        "properties": {
          "choice": {
            "$ref": "#/components/schemas/ParableConflictChoiceEnum"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "entityKind": {
            "$ref": "#/components/schemas/ParableEntityKindEnum"
          }
        },
        "required": [
          "entityKind",
          "entityKey",
          "choice"
        ],
        "type": "object"
      },
      "ParablePrepareFindingCodeEnum": {
        "enum": [
          "conflict",
          "stale_base",
          "source_retracted",
          "plot_schema_missing",
          "plot_diagnostics_stale",
          "plot_diagnostic_blocking",
          "plot_plan_failed",
          "missing_preview"
        ],
        "type": "string"
      },
      "ParablePrepareFindingView": {
        "description": "The three Prepare views sit ABOVE ParableProposalRecordView because that record\ncarries one. They were declared below it until PARABLE-1469's patch-lifecycle\nlane; the move is a move and nothing else, so that the record's `prepare` field\nnames a class the reader has already met.",
        "properties": {
          "blocking": {
            "type": "boolean"
          },
          "code": {
            "$ref": "#/components/schemas/ParablePrepareFindingCodeEnum"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "entityKind": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableEntityKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lockRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "message": {
            "description": "The authoritative reason retained with this Prepare finding.",
            "type": "string"
          },
          "schemaEpoch": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "code",
          "message",
          "blocking",
          "schemaEpoch",
          "lockRevision"
        ],
        "type": "object"
      },
      "ParablePrepareView": {
        "properties": {
          "choices": {
            "items": {
              "$ref": "#/components/schemas/ParablePrepareChoiceView"
            },
            "minItems": 0,
            "type": "array"
          },
          "findings": {
            "description": "Both lists are EMPTY on the ordinary Prepare -- a proposal that merges\ncleanly has nothing to report and nothing to choose -- and this view is\nresponse-validated by the generated route, so without `listMin: 0` the Go\nemitter's \"a required array of length 0 is MISSING\" reading answers 500\n\"Invalid response from implementation\" to exactly the case the input\nvalidator was already answering 400 to (PARABLE-3549). PARABLE-3258 is the\ngenerator-level root cause.",
            "items": {
              "$ref": "#/components/schemas/ParablePrepareFindingView"
            },
            "minItems": 0,
            "type": "array"
          },
          "freshnessFingerprint": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "prepareRequired": {
            "type": "boolean"
          },
          "proposalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "proposalId",
          "freshnessFingerprint",
          "revision",
          "prepareRequired",
          "findings",
          "choices"
        ],
        "type": "object"
      },
      "ParablePrimaryAvailabilityEnum": {
        "enum": [
          "not_published",
          "available",
          "archived"
        ],
        "type": "string"
      },
      "ParablePrimaryCommandInput": {
        "properties": {
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedAggregateRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ParablePrimaryCommandResult": {
        "properties": {
          "primary": {
            "$ref": "#/components/schemas/ParablePrimaryView"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          }
        },
        "required": [
          "receipt",
          "primary"
        ],
        "type": "object"
      },
      "ParablePrimaryOriginEnum": {
        "description": "LINEAGE, and lineage alone: does this line have a parent line above it, or\nnot. It is exactly `parable_deployment.upstream_id IS NULL` vs `IS NOT NULL`,\nwhich is the predicate read_contract.go already reads it off.\n\nIt carried a third member, `template`, until PARABLE-1469 collapsed it away.\nThat member answered a different question -- WHICH SURFACE owns the line --\nand `template` and `independent` were the SAME lineage state (no parent) told\napart by surface. The surface is already answered, separately and by name, by\nParablePublishContextEnum (parableAdmin | tenant), which the same read sets a\nfew lines above the origin it used to disagree with. Two axes in one word is\nhow a reader ends up testing `origin === template` to mean \"am I on admin\",\nwhich is what the authoring panel did.\n\n`template` was also a survivor of a retirement that had already run: commit\n33ac4f09f2 retired three type names from this vocabulary and missed this one\nbecause it is spelled as an enum VALUE rather than as a type name, so no\ncompiler and no rename sweep pointed at it. That commit names the three; this\ncomment does not spell them, because this file's text is copied verbatim into\nboth OpenAPI specs and the retired-name gate counts files, so one sentence\nnaming a retired word scores three breaches.\n\n`independent` is the survivor of the pair rather than a new word: it already\nmeant \"no parent\" on the Workspace branch before this collapse, so no member\nchanges meaning here -- one is deleted and folded into the other.",
        "enum": [
          "independent",
          "derived"
        ],
        "type": "string"
      },
      "ParablePrimaryRaciAssignmentView": {
        "properties": {
          "actor": {
            "$ref": "#/components/schemas/ParableActorSnapshotView"
          },
          "actorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "actorKind": {
            "$ref": "#/components/schemas/ParableActorKindEnum"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/ParableRaciRoleEnum"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableActorSelectionScopeEnum"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "role",
          "actorKind",
          "actorId",
          "scope",
          "actor",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "ParablePrimaryView": {
        "properties": {
          "aggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "archivedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "authoringMode": {
            "$ref": "#/components/schemas/ParableAuthoringModeEnum"
          },
          "availability": {
            "$ref": "#/components/schemas/ParablePrimaryAvailabilityEnum",
            "description": "Whether this line's content has reached its audience. Was accompanied by a\n`visibility` flag that answered the same question from a stored column\n(PARABLE-1469); this is the surviving answer."
          },
          "availableActions": {
            "description": "Every action this line knows about, enabled or not, each carrying the sentence\nto show when it cannot run (PARABLE-1469 criterion 13).\nThis is the server's answer to a question the web-app used to answer for itself.\n`AvailableActions` shipped in services/pkg/parable with a documented contract and\nzero callers, so the authoring client rebuilt the same table by hand -- and the\ncopy lost a row: the contract declares OPEN on BOTH surfaces, the client emitted\nit in no branch, and a Workspace reader was left with no control that opens a\nProposal. A dropped row and a row that was never offered look identical to\nwhatever renders them, which is exactly what criterion 13 exists to forbid.\nCarried on the PRIMARY rather than on a Proposal because the rows keyed to a\nProposal target need one in hand to answer honestly -- who authored it and\nwhether it conflicts. The line-level answer here resolves state the same way\n`capabilities` above already does: a row is offered when a Proposal in one of its\n`from` states exists on this line. The per-Proposal overlay stays with the\nProposal; see the reason layering in the web-app read model.",
            "items": {
              "$ref": "#/components/schemas/ProductParableActionAvailabilityView"
            },
            "type": "array"
          },
          "builtByParablePros": {
            "description": "True when Parable Pros built this Parable. Mirrors `ProductParable.builtByParablePros`;\nonly the admin surface can change it, so a Workspace reads it as a settled fact.",
            "type": "boolean"
          },
          "canChangeCollaborationMode": {
            "type": "boolean"
          },
          "capabilities": {
            "$ref": "#/components/schemas/ParableAuthoringCapabilitiesView"
          },
          "collaborationMode": {
            "$ref": "#/components/schemas/ParableCollaborationModeEnum",
            "description": "The line's collaboration policy, separate from an actor's participation mode."
          },
          "context": {
            "$ref": "#/components/schemas/ParablePublishContextEnum"
          },
          "currentDeploymentVersion": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableDeploymentVersionSummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "currentRolloutId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "currentVersion": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableVersionSummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "currentVersionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "latestDelivery": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableDeliverySummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "latestRollout": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableDeploymentRolloutSummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "markers": {
            "items": {
              "$ref": "#/components/schemas/ParableLifecycleMarkerEnum"
            },
            "type": "array"
          },
          "origin": {
            "$ref": "#/components/schemas/ParablePrimaryOriginEnum"
          },
          "parableHandle": {
            "description": "Current authored handle for execution context; never inferred from the ID or source text.",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "platformParable": {
            "description": "True for a Platform Parable (PARABLE-6986): deployed to every Workspace, and\nthe only kind other Parables may read. Mirrors `ProductParable.platformParable`;\nonly Parable staff in Admin change it, so a Workspace reads it as a settled fact.",
            "type": "boolean"
          },
          "policyHealth": {
            "$ref": "#/components/schemas/ParablePolicyHealthEnum"
          },
          "readOnly": {
            "type": "boolean"
          },
          "refRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "upstreamVersion": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableVersionSummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "upstreamVersionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "viewerRaciRole": {
            "description": "The viewer's own RACI role on this Parable, as the server resolved it.\nAn actor can hold more than one assignment on one Parable -- a row naming them\npersonally and a row naming their Workspace -- and this is the most capable of\nthem, folded by the same raciRoleRank the gate resolves with\n(services/pkg/parable/raci_capability.go). It is sent rather than folded on the\nclient from `ParablePrimaryRaciAssignmentView[]` for exactly that reason: a\nclient-side fold would be a second answer to a question the gate has already\nanswered, and the two would part company the first time a role is added between\ntwo existing ones.\nNull is \"no seat\", and it is narrower than it looks. Sight of a Parable IS this\nrole now, so a viewer holding nothing is refused with ErrRootRefNotFound before\nthis view is built. What reaches a reader as null is a read taken on nobody's\nbehalf: the reconciliation worker and the integration harness, which pass no\nviewer at all.\nSeparate from `capabilities` below rather than folded into it. Those booleans are\nthe surface permission and the role intersected, so they cannot say which of the\ntwo withheld something; this is the role on its own.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRaciRoleEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "workspaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "parableId",
          "parableHandle",
          "label",
          "context",
          "authoringMode",
          "origin",
          "availability",
          "collaborationMode",
          "canChangeCollaborationMode",
          "refRevision",
          "aggregateRevision",
          "readOnly",
          "markers",
          "policyHealth",
          "capabilities",
          "availableActions",
          "builtByParablePros",
          "platformParable"
        ],
        "type": "object"
      },
      "ParableProblemAwarenessCoreView": {
        "description": "Safe metadata visible to Workspace-authorized readers before full context sight.",
        "properties": {
          "actorRefs": {
            "items": {
              "$ref": "#/components/schemas/ParableActorRef"
            },
            "minItems": 0,
            "type": "array"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lifecycle": {
            "$ref": "#/components/schemas/ParableProblemLifecycleEnum"
          },
          "name": {
            "type": "string"
          },
          "resolution": {
            "$ref": "#/components/schemas/ParableProblemResolutionView"
          },
          "stage": {
            "$ref": "#/components/schemas/ParableProblemStageEnum"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "stage",
          "lifecycle",
          "resolution",
          "actorRefs",
          "updatedAt"
        ],
        "type": "object"
      },
      "ParableProblemCollaborationMutationResult": {
        "properties": {
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "relationships": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRelationship"
            },
            "type": "array"
          },
          "responsibilities": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemResponsibility"
            },
            "type": "array"
          }
        },
        "required": [
          "responsibilities",
          "relationships",
          "problemRevision"
        ],
        "type": "object"
      },
      "ParableProblemContextKindEnum": {
        "description": "Typed target classes retained across Parable and version changes.",
        "enum": [
          "parable",
          "revision",
          "version",
          "proposal",
          "piece"
        ],
        "type": "string"
      },
      "ParableProblemContextLink": {
        "description": "One durable attachment between a Workspace-owned Problem and exact Parable\ncontext. observedRevision fixes the revision used by the attachment while\nproposalRef and pieceRef identify narrower targets when present.",
        "properties": {
          "attachedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "attachedBy": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemContextKindEnum"
          },
          "lifecycle": {
            "$ref": "#/components/schemas/ParableProblemContextLinkLifecycleEnum"
          },
          "observedRevision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pieceRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePieceRevisionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "problemRevision": {
            "description": "Null only on synthetic migration links whose Message-time Problem revision cannot be proven.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "proposalRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "retiredAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "retiredBy": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableActorRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "versionRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableVersionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "id",
          "kind",
          "parableId",
          "observedRevision",
          "lifecycle",
          "attachedBy",
          "attachedAt"
        ],
        "type": "object"
      },
      "ParableProblemContextLinkLifecycleEnum": {
        "enum": [
          "active",
          "retired"
        ],
        "type": "string"
      },
      "ParableProblemContextMutationResult": {
        "properties": {
          "context": {
            "$ref": "#/components/schemas/ParableProblemContextLink"
          },
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "context",
          "problemRevision"
        ],
        "type": "object"
      },
      "ParableProblemContextSelectionInput": {
        "description": "Browser selection of exact active links. The enclosing expected Problem\nrevision makes link membership, lifecycle, and target choice race-safe.",
        "properties": {
          "contextLinkIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "mutationTargetContextLinkId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "primaryContextLinkId": {
            "description": "Null exactly when contextLinkIds is empty.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "contextLinkIds"
        ],
        "type": "object"
      },
      "ParableProblemContextSnapshot": {
        "description": "Exact active context-link set accepted with a Message or Run.",
        "properties": {
          "contextLinkIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "currentView": {
            "description": "Authorized view at submission, independent of durable Problem attachments.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemCurrentView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "digest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "mutationTargetContextLinkId": {
            "description": "Optional workflow target focus. Ordinary tools authorize their actual arguments even when absent.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pieceRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePieceRevisionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "primaryContextLinkId": {
            "description": "Context used for read orientation; null exactly when contextLinkIds is empty.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "problemRevision": {
            "description": "Null only when a migrated historical Message has no unambiguous correlated Problem fact.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "proposalRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "contextLinkIds",
          "digest"
        ],
        "type": "object"
      },
      "ParableProblemCurrentView": {
        "description": "Browser view captured with one Message; orientation, never a write grant.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PlotDataReading",
            "description": "The same CURRENT or REPORT_RUN reading supplied to React and Plots."
          },
          "observedRevision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "pieceRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePieceRevisionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "proposalRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "rootRefId": {
            "description": "Workspace Deployment root; it differs from a Proposal's working Ref.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "versionRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableVersionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "data",
          "rootRefId",
          "observedRevision"
        ],
        "type": "object"
      },
      "ParableProblemDefinition": {
        "description": "Authored Problem meaning. The id is also the durable Ponder thread identity.",
        "properties": {
          "agentCreationDepth": {
            "description": "Zero for human-created Problems; agent decomposition is bounded to eight levels.",
            "format": "int64",
            "maximum": 8,
            "minimum": 0,
            "type": "integer"
          },
          "context": {
            "description": "Compatibility projection of one current context; new readers use contexts.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemThreadContext"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "contexts": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemContextLink"
            },
            "minItems": 0,
            "type": "array"
          },
          "createdAgainst": {
            "description": "Compatibility provenance for Problems created through the original one-context API.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRevisionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "createdByRunId": {
            "description": "Internal decomposition provenance; null for human-created Problems.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isPrimary": {
            "description": "Compatibility-only primary-row signal; new readers use prominence.",
            "type": "boolean"
          },
          "lifecycle": {
            "$ref": "#/components/schemas/ParableProblemLifecycleEnum"
          },
          "name": {
            "type": "string"
          },
          "parentProblemId": {
            "description": "Compatibility-only Deployment-local parent; new readers use catalog-backed relationships.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pinnedPages": {
            "description": "Pages pinned to the Problem, oldest pin first.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemPinnedPage"
            },
            "maxItems": 24,
            "minItems": 0,
            "type": "array"
          },
          "primaryIdentityId": {
            "description": "Compatibility-only Deployment-local identity; new readers use the Workspace Problem id.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "prominence": {
            "$ref": "#/components/schemas/ParableProblemProminenceEnum"
          },
          "proofs": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemProof"
            },
            "minItems": 0,
            "type": "array"
          },
          "relationships": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRelationship"
            },
            "minItems": 0,
            "type": "array"
          },
          "responsibilities": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemResponsibility"
            },
            "minItems": 0,
            "type": "array"
          },
          "rootRefId": {
            "description": "Compatibility root used by primary Problems before exact context links existed.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "stage": {
            "$ref": "#/components/schemas/ParableProblemStageEnum"
          },
          "workspaceId": {
            "description": "Owning Workspace. Parable contexts below are attachments, not owners.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "workspaceId",
          "agentCreationDepth",
          "contexts",
          "stage",
          "lifecycle",
          "prominence",
          "isPrimary",
          "responsibilities",
          "relationships",
          "proofs",
          "pinnedPages"
        ],
        "type": "object"
      },
      "ParableProblemDetailView": {
        "properties": {
          "actors": {
            "items": {
              "$ref": "#/components/schemas/ParableActorSnapshotView"
            },
            "type": "array"
          },
          "engagements": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemEngagement"
            },
            "type": "array"
          },
          "messages": {
            "description": "Newest bounded page in chronological order. Use olderMessageCursor to continue backward.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemMessage"
            },
            "type": "array"
          },
          "meterUsage": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRunMeterUsageView"
            },
            "type": "array"
          },
          "olderMessageCursor": {
            "description": "Exclusive sequence cursor for the next older Message page; null when history is complete.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "pendingApprovals": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRunApproval"
            },
            "type": "array"
          },
          "pings": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemPingView"
            },
            "type": "array"
          },
          "possibilities": {
            "items": {
              "$ref": "#/components/schemas/ParablePossibility"
            },
            "type": "array"
          },
          "problem": {
            "$ref": "#/components/schemas/ParableProblemDefinition"
          },
          "proofEvaluations": {
            "items": {
              "$ref": "#/components/schemas/ParableProofEvaluation"
            },
            "type": "array"
          },
          "resolution": {
            "$ref": "#/components/schemas/ParableProblemResolutionView"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "runs": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRun"
            },
            "type": "array"
          }
        },
        "required": [
          "problem",
          "revision",
          "messages",
          "runs",
          "pendingApprovals",
          "pings",
          "possibilities",
          "engagements",
          "actors",
          "proofEvaluations",
          "resolution",
          "meterUsage"
        ],
        "type": "object"
      },
      "ParableProblemDispatchSnapshotDigestVersionEnum": {
        "description": "Cross-language scalar-tree canonicalization recipe for immutable dispatch payloads.",
        "enum": [
          "scalar_tree_v1"
        ],
        "type": "string"
      },
      "ParableProblemEngagement": {
        "properties": {
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "endedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "lastActiveAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "problemId",
          "actorRef",
          "startedAt",
          "lastActiveAt"
        ],
        "type": "object"
      },
      "ParableProblemFullCoreView": {
        "description": "Full-only stable fields that may reveal protected authored meaning.",
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "prominence": {
            "$ref": "#/components/schemas/ParableProblemProminenceEnum"
          },
          "responsibilities": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemResponsibility"
            },
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "prominence",
          "responsibilities"
        ],
        "type": "object"
      },
      "ParableProblemGraphNodeView": {
        "properties": {
          "contexts": {
            "description": "Null for awareness-only nodes; never an empty-value authorization signal.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemContextLink"
            },
            "nullable": true,
            "type": "array"
          },
          "core": {
            "$ref": "#/components/schemas/ParableProblemAwarenessCoreView"
          },
          "fullCore": {
            "description": "Null for awareness-only nodes; full nodes always include authored stable fields.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemFullCoreView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "presence": {
            "description": "Null for awareness-only nodes because location is protected context.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemPresenceSummaryView"
            },
            "nullable": true,
            "type": "array"
          },
          "relationships": {
            "description": "Null for awareness-only nodes because metadata may contain protected context.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemGraphRelationshipView"
            },
            "nullable": true,
            "type": "array"
          },
          "visibility": {
            "$ref": "#/components/schemas/ParableProblemVisibilityLevelEnum"
          }
        },
        "required": [
          "visibility",
          "core"
        ],
        "type": "object"
      },
      "ParableProblemGraphPageView": {
        "properties": {
          "graphDigest": {
            "description": "Hash of the complete authorized filtered projection before cursor pagination.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemGraphNodeView"
            },
            "minItems": 0,
            "type": "array"
          },
          "nextCursor": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "items",
          "graphDigest"
        ],
        "type": "object"
      },
      "ParableProblemGraphRelationshipView": {
        "properties": {
          "metadata": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "sourceProblemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "targetProblemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "typeRevision": {
            "$ref": "#/components/schemas/ParableProblemRelationshipTypeRevision"
          }
        },
        "required": [
          "sourceProblemId",
          "targetProblemId",
          "typeRevision",
          "metadata"
        ],
        "type": "object"
      },
      "ParableProblemLifecycleEnum": {
        "enum": [
          "active",
          "pocketed"
        ],
        "type": "string"
      },
      "ParableProblemLifecycleMutationResult": {
        "description": "The committed lifecycle and current Problem revision, including idempotent replay.",
        "properties": {
          "lifecycle": {
            "$ref": "#/components/schemas/ParableProblemLifecycleEnum"
          },
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "lifecycle",
          "problemRevision"
        ],
        "type": "object"
      },
      "ParableProblemMentionAccessPlanView": {
        "description": "Atomic plan: confirmation either applies every listed transition or none.",
        "properties": {
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "createsNotification": {
            "type": "boolean"
          },
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "grantsPeepingAccess": {
            "type": "boolean"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "planDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "publishesPersonalContext": {
            "type": "boolean"
          },
          "requiresConfirmation": {
            "type": "boolean"
          },
          "summary": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "problemId",
          "actorRef",
          "requiresConfirmation",
          "publishesPersonalContext",
          "grantsPeepingAccess",
          "createsNotification",
          "summary",
          "planDigest",
          "expiresAt"
        ],
        "type": "object"
      },
      "ParableProblemMentionPlanConsumptionInput": {
        "description": "Confirmation proof consumed atomically with the authored Message. The server\nverifies the plan still names actorRef, is unexpired, and matches planDigest.",
        "properties": {
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "planDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "planId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "planId",
          "actorRef",
          "planDigest"
        ],
        "type": "object"
      },
      "ParableProblemMessage": {
        "description": "Durable conversation identity with the native AI SDK UIMessage and historical product parts.",
        "properties": {
          "audience": {
            "description": "Empty for an ordinary Message; explicit assignments only.",
            "items": {
              "$ref": "#/components/schemas/ParableActorAssignment"
            },
            "minItems": 0,
            "type": "array"
          },
          "author": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "causation": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemMessageCausationRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "completedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "contextSnapshot": {
            "description": "Null only for a historical Message accepted by a pre-context-link pod during rollout.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemContextSnapshot"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "Separate from Run idempotency so a Message can exist without or trigger several Runs.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "mentions": {
            "description": "Attention targets only; mentions never narrow Message visibility.",
            "items": {
              "$ref": "#/components/schemas/ParableActorRef"
            },
            "minItems": 0,
            "type": "array"
          },
          "modelName": {
            "description": "The name of the model that answered an assistant Message, such as\n`Claude Sonnet 5.5 · High` (PARABLE-6164). Null on a Ponder answer, on a\nperson's Message, and on Messages answered before the field existed; a\nreader labels those \"Ponder\".",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "observedRevision": {
            "description": "Null only for a context-free Workspace Problem Message.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRevisionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "parts": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemMessagePart"
            },
            "minItems": 1,
            "type": "array"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "regarding": {
            "items": {
              "$ref": "#/components/schemas/ParableMessageRegarding"
            },
            "minItems": 0,
            "type": "array"
          },
          "role": {
            "$ref": "#/components/schemas/ParableProblemMessageRoleEnum"
          },
          "sentAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "sequence": {
            "description": "Monotonic within one Problem; transport chunks never consume message sequence numbers.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemMessageStatusEnum"
          },
          "uiMessage": {
            "description": "Native public AI SDK UIMessage, validated by the SDK; null for historical messages.",
            "nullable": true
          }
        },
        "required": [
          "id",
          "problemId",
          "idempotencyKey",
          "sequence",
          "role",
          "status",
          "author",
          "mentions",
          "audience",
          "parts",
          "regarding",
          "sentAt"
        ],
        "type": "object"
      },
      "ParableProblemMessageCausationRef": {
        "description": "Typed product-fact cause of a durable Problem message.",
        "discriminator": {
          "mapping": {
            "approval": "#/components/schemas/ApprovalMessageCausationRef",
            "fact": "#/components/schemas/FactMessageCausationRef",
            "message": "#/components/schemas/PriorMessageCausationRef",
            "run": "#/components/schemas/RunMessageCausationRef",
            "tool_call": "#/components/schemas/ToolCallMessageCausationRef"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/RunMessageCausationRef"
          },
          {
            "$ref": "#/components/schemas/ToolCallMessageCausationRef"
          },
          {
            "$ref": "#/components/schemas/ApprovalMessageCausationRef"
          },
          {
            "$ref": "#/components/schemas/PriorMessageCausationRef"
          },
          {
            "$ref": "#/components/schemas/FactMessageCausationRef"
          }
        ]
      },
      "ParableProblemMessageNativeToolEnum": {
        "enum": [
          "executeParableOperation",
          "pingQuestion"
        ],
        "type": "string"
      },
      "ParableProblemMessagePageView": {
        "description": "One bounded chronological Message page read from newest history toward older history.",
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemMessage"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "olderCursor": {
            "description": "Exclusive sequence cursor for the next older page; null when history is complete.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ParableProblemMessagePanePreviewStatusEnum": {
        "enum": [
          "ready",
          "no_parable",
          "not_visible",
          "unavailable",
          "not_built",
          "no_such_pane"
        ],
        "type": "string"
      },
      "ParableProblemMessagePaneSummary": {
        "properties": {
          "handle": {
            "nullable": true,
            "type": "string"
          },
          "key": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParablePieceKindEnum"
          },
          "name": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "key",
          "kind"
        ],
        "type": "object"
      },
      "ParableProblemMessagePart": {
        "description": "Parable-owned normalized multipart message content.",
        "discriminator": {
          "mapping": {
            "attachment": "#/components/schemas/MessageAttachmentPart",
            "error": "#/components/schemas/MessageErrorPart",
            "harness_activity": "#/components/schemas/MessageHarnessActivityPart",
            "reasoning_summary": "#/components/schemas/MessageReasoningSummaryPart",
            "source": "#/components/schemas/MessageSourcePart",
            "text": "#/components/schemas/MessageTextPart",
            "tool_activity": "#/components/schemas/MessageToolActivityPart",
            "tool_approval": "#/components/schemas/MessageToolApprovalPart"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/MessageTextPart"
          },
          {
            "$ref": "#/components/schemas/MessageReasoningSummaryPart"
          },
          {
            "$ref": "#/components/schemas/MessageToolActivityPart"
          },
          {
            "$ref": "#/components/schemas/MessageToolApprovalPart"
          },
          {
            "$ref": "#/components/schemas/MessageSourcePart"
          },
          {
            "$ref": "#/components/schemas/MessageAttachmentPart"
          },
          {
            "$ref": "#/components/schemas/MessageErrorPart"
          },
          {
            "$ref": "#/components/schemas/MessageHarnessActivityPart"
          }
        ]
      },
      "ParableProblemMessagePartKindEnum": {
        "enum": [
          "text",
          "reasoning_summary",
          "tool_activity",
          "tool_approval",
          "source",
          "attachment",
          "error",
          "harness_activity"
        ],
        "type": "string"
      },
      "ParableProblemMessagePingAskStatusEnum": {
        "enum": [
          "asked",
          "refused"
        ],
        "type": "string"
      },
      "ParableProblemMessagePowerReadStatusEnum": {
        "enum": [
          "ready",
          "not_found"
        ],
        "type": "string"
      },
      "ParableProblemMessageRoleEnum": {
        "enum": [
          "user",
          "assistant",
          "system"
        ],
        "type": "string"
      },
      "ParableProblemMessageStatusEnum": {
        "enum": [
          "pending",
          "streaming",
          "completed",
          "failed",
          "cancelled"
        ],
        "type": "string"
      },
      "ParableProblemMessageToolApprovalStateEnum": {
        "enum": [
          "pending"
        ],
        "type": "string"
      },
      "ParableProblemMessageToolInvocationStatusEnum": {
        "enum": [
          "completed",
          "failed",
          "in_progress",
          "unknown",
          "not_admitted",
          "cancelled"
        ],
        "type": "string"
      },
      "ParableProblemMessageToolScope": {
        "additionalProperties": false,
        "description": "Proof that a Ponder callback acts for one accepted user Message. web-api\nreloads the Message and refuses the call when the Problem, the accepted\ncontext digest, or the tool policy digest no longer match. Every\nordinary-exchange callback carries it.",
        "properties": {
          "contextDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "operationSurface": {
            "$ref": "#/components/schemas/PonderParableOperationSurfaceEnum"
          },
          "policyDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "operationSurface",
          "problemId",
          "contextDigest",
          "policyDigest"
        ],
        "type": "object"
      },
      "ParableProblemPageView": {
        "properties": {
          "automaticProblemId": {
            "description": "The active primary Problem in this root, otherwise its earliest active Problem.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemSummaryView"
            },
            "minItems": 0,
            "type": "array"
          },
          "nextCursor": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ParableProblemPersonView": {
        "description": "One person the Problem tree names, with what the people filter reads.",
        "properties": {
          "actor": {
            "$ref": "#/components/schemas/ParableActorSnapshotView"
          },
          "seat": {
            "description": "Their seat on the Parable. Null when they hold none.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRaciRoleEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "workspaceRoles": {
            "description": "The names of the Workspace Roles they hold, such as Viewer. Empty unless\nthe reader may view the Workspace's members (tenant.user.view or\nadmin.user.view).",
            "items": {
              "type": "string"
            },
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "actor",
          "workspaceRoles"
        ],
        "type": "object"
      },
      "ParableProblemPing": {
        "properties": {
          "closedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "messageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "openedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "purposes": {
            "items": {
              "$ref": "#/components/schemas/ProblemPingPurpose"
            },
            "type": "array"
          },
          "recipientSummary": {
            "description": "Redacted cross-Workspace-safe summary; it never grants source Problem sight.",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "requestedBy": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "targets": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemPingTarget"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "problemId",
          "revision",
          "requestedBy",
          "recipientSummary",
          "purposes",
          "targets",
          "openedAt"
        ],
        "type": "object"
      },
      "ParableProblemPingDeliveryStatusEnum": {
        "enum": [
          "pending",
          "delivered",
          "failed",
          "revoked"
        ],
        "type": "string"
      },
      "ParableProblemPingInboxItemView": {
        "properties": {
          "closedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "notification": {
            "$ref": "#/components/schemas/ParableProblemPingNotificationView"
          },
          "readReceipt": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemPingReadReceiptView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "readState": {
            "$ref": "#/components/schemas/ParableProblemPingReadStateEnum"
          },
          "response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemPingResponse"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "responseState": {
            "$ref": "#/components/schemas/ParableProblemPingResponseStateEnum"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "notification",
          "revision",
          "readState",
          "responseState"
        ],
        "type": "object"
      },
      "ParableProblemPingInboxPageView": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemPingInboxItemView"
            },
            "type": "array"
          },
          "nextCursor": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ParableProblemPingNotificationView": {
        "description": "Target-owned notification. It intentionally exposes no source Workspace, Problem, or Message ID.",
        "properties": {
          "deliveredAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "deliveryStatus": {
            "$ref": "#/components/schemas/ParableProblemPingDeliveryStatusEnum"
          },
          "envelope": {
            "$ref": "#/components/schemas/ParableProblemPingRedactedEnvelope"
          },
          "inboxItemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "inboxItemId",
          "envelope",
          "deliveryStatus"
        ],
        "type": "object"
      },
      "ParableProblemPingPageView": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemPingView"
            },
            "type": "array"
          },
          "nextCursor": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ParableProblemPingReadReceiptView": {
        "properties": {
          "inboxItemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "readAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "readThroughRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "inboxItemId",
          "readThroughRevision",
          "readAt"
        ],
        "type": "object"
      },
      "ParableProblemPingReadStateEnum": {
        "enum": [
          "unread",
          "read"
        ],
        "type": "string"
      },
      "ParableProblemPingRecipientView": {
        "properties": {
          "deliveredAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "deliveryStatus": {
            "$ref": "#/components/schemas/ParableProblemPingDeliveryStatusEnum"
          },
          "inboxItemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "readAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "readState": {
            "$ref": "#/components/schemas/ParableProblemPingReadStateEnum"
          },
          "recipient": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "recipientId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "respondedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "responseState": {
            "$ref": "#/components/schemas/ParableProblemPingResponseStateEnum"
          },
          "targetActor": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "targetId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "targetWorkspaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "targetId",
          "targetWorkspaceId",
          "targetActor",
          "recipientId",
          "recipient",
          "inboxItemRevision",
          "deliveryStatus",
          "readState",
          "responseState"
        ],
        "type": "object"
      },
      "ParableProblemPingRedactedEnvelope": {
        "description": "Sender-authored content safe to copy into a target Workspace without source identifiers.",
        "properties": {
          "audiences": {
            "items": {
              "$ref": "#/components/schemas/ProblemPingAudienceEnum"
            },
            "type": "array"
          },
          "openedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "summary": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "summary",
          "audiences",
          "openedAt"
        ],
        "type": "object"
      },
      "ParableProblemPingResponse": {
        "properties": {
          "answers": {
            "items": {
              "$ref": "#/components/schemas/ParablePingAnswer"
            },
            "minItems": 0,
            "type": "array"
          },
          "body": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "recipientId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "respondedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "respondedBy": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "selectedPossibilityIds": {
            "description": "Compatibility projection flattening every answer; new readers use answers.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "pingId",
          "recipientId",
          "respondedBy",
          "body",
          "selectedPossibilityIds",
          "answers",
          "respondedAt"
        ],
        "type": "object"
      },
      "ParableProblemPingResponseStateEnum": {
        "enum": [
          "not_requested",
          "awaiting_response",
          "responded",
          "closed_without_response"
        ],
        "type": "string"
      },
      "ParableProblemPingTarget": {
        "properties": {
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "workspaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "workspaceId",
          "actorRef"
        ],
        "type": "object"
      },
      "ParableProblemPingView": {
        "properties": {
          "ping": {
            "$ref": "#/components/schemas/ParableProblemPing"
          },
          "possibilities": {
            "description": "Every Possibility the Ping's questions offer, so one read renders the card.",
            "items": {
              "$ref": "#/components/schemas/ParablePossibility"
            },
            "minItems": 0,
            "type": "array"
          },
          "recipients": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemPingRecipientView"
            },
            "type": "array"
          },
          "responses": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemPingResponse"
            },
            "type": "array"
          }
        },
        "required": [
          "ping",
          "recipients",
          "responses",
          "possibilities"
        ],
        "type": "object"
      },
      "ParableProblemPinnedPage": {
        "description": "A Page pinned to a Problem. Pins are shared: everyone in the Problem sees the\npinned Pages as tabs in Ponder, after the Parable's home Page.",
        "properties": {
          "pageId": {
            "description": "The Page Piece, in the Parable the Problem is viewed from.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pinnedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "pinnedBy": {
            "$ref": "#/components/schemas/ParableActorRef"
          }
        },
        "required": [
          "pageId",
          "pinnedBy",
          "pinnedAt"
        ],
        "type": "object"
      },
      "ParableProblemPinnedPagesMutationResult": {
        "description": "Every Page pinned to the Problem after the change, and the Problem revision.",
        "properties": {
          "pinnedPages": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemPinnedPage"
            },
            "maxItems": 24,
            "minItems": 0,
            "type": "array"
          },
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "pinnedPages",
          "problemRevision"
        ],
        "type": "object"
      },
      "ParableProblemPresenceSummaryView": {
        "properties": {
          "activeInProblem": {
            "type": "boolean"
          },
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "lastActiveAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "actorRef",
          "activeInProblem",
          "lastActiveAt"
        ],
        "type": "object"
      },
      "ParableProblemProminenceEnum": {
        "description": "Stable orientation signal; it is independent of context ownership.",
        "enum": [
          "standard",
          "primary"
        ],
        "type": "string"
      },
      "ParableProblemProof": {
        "description": "Authored proof definition for a Problem.",
        "discriminator": {
          "mapping": {
            "people": "#/components/schemas/PeopleProof",
            "picture": "#/components/schemas/PictureProof",
            "plot": "#/components/schemas/PlotProof",
            "ponder": "#/components/schemas/PonderProof"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/PictureProof"
          },
          {
            "$ref": "#/components/schemas/PeopleProof"
          },
          {
            "$ref": "#/components/schemas/PonderProof"
          },
          {
            "$ref": "#/components/schemas/PlotProof"
          }
        ]
      },
      "ParableProblemProofKindEnum": {
        "enum": [
          "picture",
          "people",
          "ponder",
          "plot"
        ],
        "type": "string"
      },
      "ParableProblemProofRevisionRef": {
        "properties": {
          "authoredAgainst": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "proofId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "proofId",
          "revisionId",
          "authoredAgainst"
        ],
        "type": "object"
      },
      "ParableProblemRelationship": {
        "properties": {
          "metadata": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "relationshipTypeRevisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "targetProblemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "targetProblemId",
          "relationshipTypeRevisionId",
          "metadata"
        ],
        "type": "object"
      },
      "ParableProblemRelationshipDirectionalityEnum": {
        "enum": [
          "directed",
          "symmetric"
        ],
        "type": "string"
      },
      "ParableProblemRelationshipTypeLifecycleEnum": {
        "enum": [
          "active",
          "deprecated"
        ],
        "type": "string"
      },
      "ParableProblemRelationshipTypePageView": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRelationshipTypeRevision"
            },
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ParableProblemRelationshipTypeRevision": {
        "description": "Immutable catalog revision used to validate and interpret Problem edges.",
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "directionality": {
            "$ref": "#/components/schemas/ParableProblemRelationshipDirectionalityEnum"
          },
          "forwardLabel": {
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "inverseLabel": {
            "type": "string"
          },
          "lifecycle": {
            "$ref": "#/components/schemas/ParableProblemRelationshipTypeLifecycleEnum"
          },
          "metadataSchema": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "name": {
            "type": "string"
          },
          "publishedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "relationshipTypeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "schemaDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "relationshipTypeId",
          "revision",
          "forwardLabel",
          "inverseLabel",
          "directionality",
          "lifecycle",
          "metadataSchema",
          "schemaDigest",
          "publishedAt"
        ],
        "type": "object"
      },
      "ParableProblemResolutionStatusEnum": {
        "enum": [
          "unresolved",
          "failed",
          "proven"
        ],
        "type": "string"
      },
      "ParableProblemResolutionView": {
        "description": "Derived proof result; aggregation policy remains outside this contract slice.",
        "properties": {
          "proofEvaluationIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 0,
            "type": "array"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemResolutionStatusEnum"
          }
        },
        "required": [
          "status",
          "proofEvaluationIds"
        ],
        "type": "object"
      },
      "ParableProblemResponsibility": {
        "description": "Authored intent; persistence later joins this value to the Problem revision.",
        "properties": {
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "role": {
            "$ref": "#/components/schemas/ParableRaciRoleEnum"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableActorSelectionScopeEnum"
          }
        },
        "required": [
          "actorRef",
          "role",
          "scope"
        ],
        "type": "object"
      },
      "ParableProblemRun": {
        "description": "Durable Parable execution record. External workflow IDs are adapter references only.",
        "properties": {
          "cancellation": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProblemRunCancellation"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "completedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "contextSnapshot": {
            "description": "Null only for a historical Run accepted by a pre-context-link pod during rollout.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemContextSnapshot"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "debugEnabled": {
            "description": "Employee-authorized diagnostic policy is fixed when the Run is accepted.",
            "type": "boolean"
          },
          "debugPolicyVersion": {
            "nullable": true,
            "type": "string"
          },
          "decompositionDepth": {
            "description": "Zero for human-started Runs; server rejects agent chains deeper than eight.",
            "format": "int64",
            "maximum": 8,
            "minimum": 0,
            "type": "integer"
          },
          "dispatchAttemptCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "dispatchStatus": {
            "$ref": "#/components/schemas/ParableProblemRunDispatchStatusEnum"
          },
          "externalWorkflow": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ExternalWorkflowRunRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "initiatedBy": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "observedRevision": {
            "description": "Null only for a context-free Workspace Problem Run.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRevisionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "outcome": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SafeRunOutcome"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "requestedPersonaSelection": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemRunPersonaRequest"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "resolvedPersonaSelection": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemRunPersonaResolution"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "runtimeTarget": {
            "$ref": "#/components/schemas/ModelExecutionTargetSnapshot"
          },
          "selectedSkillIds": {
            "description": "Stable IDs requested by the actor; instruction snapshots stay internal to dispatch.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 20,
            "minItems": 0,
            "type": "array"
          },
          "spawnedByRunId": {
            "description": "Internal agent decomposition ancestry; null for human-started Runs.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemRunStatusEnum"
          },
          "triggerKind": {
            "$ref": "#/components/schemas/ParableProblemRunTriggerKindEnum"
          },
          "triggeredByMessageId": {
            "description": "Non-unique: one committed Message may trigger retries or regenerated Runs.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "usage": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SafeRunUsage"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "id",
          "problemId",
          "triggerKind",
          "triggeredByMessageId",
          "decompositionDepth",
          "runtimeTarget",
          "selectedSkillIds",
          "debugEnabled",
          "initiatedBy",
          "revision",
          "idempotencyKey",
          "status",
          "dispatchStatus",
          "dispatchAttemptCount",
          "createdAt"
        ],
        "type": "object"
      },
      "ParableProblemRunAdapterEnum": {
        "description": "Which driver executes a Run. Stored on the Run's `externalWorkflowAdapter`\nand carried by every runtime callback, so web-api can prove the caller is\nthe driver that bound the Run. web_db's\nparable_problem_run_external_workflow_adapter_check holds the column to\nthese values; add a member and widen that constraint together.",
        "enum": [
          "aiSdkDirect",
          "duroxide"
        ],
        "type": "string"
      },
      "ParableProblemRunApproval": {
        "description": "Parable is the authorization authority; an external workflow only pauses and replays.",
        "properties": {
          "argumentsDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "authorizedAudience": {
            "$ref": "#/components/schemas/EffectiveRaciAudienceDefinition"
          },
          "decidedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "decider": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableActorRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "decision": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProblemRunDecisionEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "decisionDeliveryStatus": {
            "$ref": "#/components/schemas/ProblemRunDecisionDeliveryStatusEnum"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "Idempotency identity of the immutable approval request, not its later decision.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "operationId": {
            "description": "Legacy Piece-tool approvals may not have generated-operation identity.",
            "nullable": true,
            "type": "string"
          },
          "requestedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/ProblemRunDecisionStateEnum"
          },
          "toolCallRef": {
            "$ref": "#/components/schemas/ExternalToolCallRef"
          },
          "toolName": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "runId",
          "toolCallRef",
          "authorizedAudience",
          "state",
          "decisionDeliveryStatus",
          "revision",
          "idempotencyKey",
          "requestedAt"
        ],
        "type": "object"
      },
      "ParableProblemRunDiagnosticEventPageView": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRunDiagnosticEventView"
            },
            "minItems": 0,
            "type": "array"
          },
          "nextCursor": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ParableProblemRunDiagnosticEventView": {
        "description": "A stored diagnostic event. safePayload is a PonderRunDiagnosticPayload for\nevery event recorded since PARABLE-5063; it stays untyped here so rows\nrecorded before it, without a payload kind, still read.",
        "properties": {
          "correlationId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "recordedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "safePayload": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "sequence": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "runId",
          "sequence",
          "stepIndex",
          "kind",
          "safePayload",
          "correlationId",
          "recordedAt"
        ],
        "type": "object"
      },
      "ParableProblemRunDispatchStatusEnum": {
        "enum": [
          "pending",
          "claimed",
          "bound",
          "terminal"
        ],
        "type": "string"
      },
      "ParableProblemRunMeterUsageView": {
        "properties": {
          "componentRole": {
            "$ref": "#/components/schemas/ModelExecutionComponentRoleEnum"
          },
          "currencyCode": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "estimatedCostMicros": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "meterKey": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "priceRateId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "quantity": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "runId",
          "componentRole",
          "priceRateId",
          "meterKey",
          "quantity",
          "estimatedCostMicros",
          "currencyCode"
        ],
        "type": "object"
      },
      "ParableProblemRunPersonaRequest": {
        "description": "Historical: the Persona a Run started before PARABLE-6164 asked for. Those\nRuns keep it in `requestedPersonaSelection`; nothing writes one now.",
        "properties": {
          "manualModelReleaseId": {
            "description": "Orthogonal manual Primary override; it preserves the active personality.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personaId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "profileOverride": {
            "description": "Optional validated private ranking for the selected profile only.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderPersonaProfileOverride"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "slot": {
            "$ref": "#/components/schemas/PersonaPersonalitySlotEnum"
          }
        },
        "required": [
          "slot"
        ],
        "type": "object"
      },
      "ParableProblemRunPersonaResolution": {
        "description": "Backward-readable legacy or fully resolved Persona execution snapshot.",
        "discriminator": {
          "mapping": {
            "legacy": "#/components/schemas/LegacyParableProblemRunPersonaResolution",
            "resolved": "#/components/schemas/ResolvedParableProblemRunPersonaSelection"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/LegacyParableProblemRunPersonaResolution"
          },
          {
            "$ref": "#/components/schemas/ResolvedParableProblemRunPersonaSelection"
          }
        ]
      },
      "ParableProblemRunPersonaResolutionKindEnum": {
        "enum": [
          "legacy",
          "resolved"
        ],
        "type": "string"
      },
      "ParableProblemRunStatusEnum": {
        "enum": [
          "pending",
          "running",
          "waiting_for_approval",
          "cancelling",
          "completed",
          "completed_after_cancel",
          "failed",
          "cancelled"
        ],
        "type": "string"
      },
      "ParableProblemRunStreamChunkPageView": {
        "description": "One page of a Run's stored stream parts for a browser, in step and seq order.",
        "properties": {
          "chunks": {
            "items": {
              "$ref": "#/components/schemas/PonderRunStreamChunk"
            },
            "maxItems": 512,
            "minItems": 0,
            "type": "array"
          },
          "messageId": {
            "description": "The Run's assistant Message the chunks belong to; null before the first batch.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "nextIndex": {
            "description": "The startIndex for the next page. A page shorter than the limit is the end of what is stored.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "runId",
          "chunks",
          "nextIndex"
        ],
        "type": "object"
      },
      "ParableProblemRunToolApprovalPolicyEnum": {
        "enum": [
          "automatic",
          "human_required"
        ],
        "type": "string"
      },
      "ParableProblemRunToolDescriptor": {
        "properties": {
          "approvalPolicy": {
            "$ref": "#/components/schemas/ParableProblemRunToolApprovalPolicyEnum"
          },
          "capability": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "effectivePersonaPolicy": {
            "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum"
          },
          "guidance": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderParableOperationGuidance"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "iconName": {
            "type": "string"
          },
          "inputSchema": {
            "description": "Any valid JSON value: object, array, primitive, or null",
            "nullable": true
          },
          "inputSchemaDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "operationId": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "toolName": {
            "type": "string"
          }
        },
        "required": [
          "toolName",
          "operationId",
          "title",
          "description",
          "iconName",
          "capability",
          "approvalPolicy",
          "effectivePersonaPolicy",
          "inputSchemaDigest"
        ],
        "type": "object"
      },
      "ParableProblemRunToolGrant": {
        "description": "Immutable grant supplied to the run-scoped generated-operation broker.",
        "properties": {
          "approvalPolicy": {
            "$ref": "#/components/schemas/ParableProblemRunToolApprovalPolicyEnum"
          },
          "capability": {
            "type": "string"
          },
          "inputSchemaDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "operationId": {
            "type": "string"
          },
          "title": {
            "description": "Immutable generated operation title; this is the only normal-UI activity label.",
            "maxLength": 160,
            "minLength": 1,
            "type": "string"
          },
          "toolName": {
            "type": "string"
          }
        },
        "required": [
          "toolName",
          "operationId",
          "title",
          "capability",
          "approvalPolicy",
          "inputSchemaDigest"
        ],
        "type": "object"
      },
      "ParableProblemRunToolGrantSet": {
        "properties": {
          "aggregateDigest": {
            "description": "Binds every ordered grant field, including the immutable public title.\nRecipe: SHA-256 of the compact UTF-8 JSON object with the keys surface,\noperations, and registryDigest in that order, each operation's keys in\ndeclared order, operations sorted by toolName, and no HTML escaping.\nweb-api computes it and ponder-api recomputes it byte for byte; the shared\nvector is services/mcp-server/runtimebroker/testdata/grant_aggregate_digest.json.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "operations": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRunToolGrant"
            },
            "maxItems": 1000,
            "minItems": 0,
            "type": "array"
          },
          "registryDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "surface": {
            "$ref": "#/components/schemas/ParableProblemRunToolSurfaceEnum"
          }
        },
        "required": [
          "surface",
          "operations",
          "registryDigest",
          "aggregateDigest"
        ],
        "type": "object"
      },
      "ParableProblemRunToolInvocationStatusEnum": {
        "enum": [
          "in_progress",
          "completed",
          "failed",
          "approval_required"
        ],
        "type": "string"
      },
      "ParableProblemRunToolSurfaceEnum": {
        "enum": [
          "workspace_api"
        ],
        "type": "string"
      },
      "ParableProblemRunTriggerInput": {
        "description": "Start a Run by atomically appending a new Message or by referencing an existing committed Message.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/NewMessageParableProblemRunTriggerInput"
          },
          {
            "$ref": "#/components/schemas/ExistingMessageParableProblemRunTriggerInput"
          }
        ]
      },
      "ParableProblemRunTriggerKindEnum": {
        "enum": [
          "new_message",
          "existing_message"
        ],
        "type": "string"
      },
      "ParableProblemRuntimeDispatchInput": {
        "properties": {
          "contextSnapshot": {
            "$ref": "#/components/schemas/ParableProblemContextSnapshot"
          },
          "debug": {
            "$ref": "#/components/schemas/PonderRunDebugPolicySnapshot"
          },
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "dispatchSnapshotDigestVersion": {
            "$ref": "#/components/schemas/ParableProblemDispatchSnapshotDigestVersionEnum"
          },
          "executionPolicyDigest": {
            "description": "Canonical digest includes every candidate, binding digest, and Provider Product provenance.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "graphDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "messages": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemMessage"
            },
            "maxItems": 2000,
            "minItems": 1,
            "type": "array"
          },
          "modelCandidates": {
            "description": "Historical ranked candidates. Empty for a Run that executes `route`\n(PARABLE-6164); Runs sealed before it hold at least one.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemRuntimeModelCandidate"
            },
            "maxItems": 101,
            "minItems": 0,
            "type": "array"
          },
          "modelPolicy": {
            "description": "The Workspace's effective AI model policy when the Run was claimed\n(PARABLE-4670). web-api computes it live, so a policy change reaches the\nnext dispatch; the snapshot digest seals it for this Run. Null only in\nsnapshots persisted before the field existed.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/EffectiveModelPolicy"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "personaDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "promotesDigest": {
            "description": "Historical sealed snapshot digest; omitted by current acceptance.",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "route": {
            "description": "The model route the Run executes (PARABLE-6164). Null in snapshots\npersisted before the field existed; an absent field is left out of the\ndigest, so their digests still match.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderChatModelRoute"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "run": {
            "$ref": "#/components/schemas/ParableProblemRun"
          },
          "skills": {
            "items": {
              "$ref": "#/components/schemas/AgentSkillSnapshot"
            },
            "maxItems": 20,
            "minItems": 0,
            "type": "array"
          },
          "toolGrant": {
            "$ref": "#/components/schemas/ParableProblemRunToolGrantSet"
          },
          "workspaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "workspaceSlug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "workspaceId",
          "workspaceSlug",
          "run",
          "messages",
          "skills",
          "modelCandidates",
          "toolGrant",
          "contextSnapshot",
          "debug",
          "executionPolicyDigest",
          "personaDigest",
          "graphDigest",
          "dispatchSnapshotDigestVersion",
          "dispatchSnapshotDigest"
        ],
        "type": "object"
      },
      "ParableProblemRuntimeModelCandidate": {
        "description": "Ranked Run candidate: the executable model plus the immutable evidence the Run cites.",
        "properties": {
          "availabilityObservationIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "capabilityObservationIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "configYaml": {
            "description": "Authored OpenRouter request config (YAML) for this candidate, exactly as saved.",
            "maxLength": 16384,
            "type": "string"
          },
          "contextTokenLimit": {
            "description": "Combined input/output context window pinned for this execution; null means unknown.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "modelReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outputTokenLimit": {
            "description": "Observed model response maximum pinned for this execution; null means unknown.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "priceRateIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "processor": {
            "description": "The AI processor the route sends the conversation to. web-api admits a\ncandidate only when the Workspace's AI model policy lets this processor\nserve the profile's chat capability (PARABLE-4675). Null only on\ncandidates committed before the field existed.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ModelProcessor"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "providerProductIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "rank": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "route": {
            "$ref": "#/components/schemas/ParableProblemRuntimeModelRoute"
          },
          "routeBindingConfigurationDigest": {
            "description": "Revalidated against the mutable binding before every model attempt.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "routeBindingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "rank",
          "modelReleaseId",
          "routeBindingId",
          "route",
          "configYaml",
          "routeBindingConfigurationDigest",
          "capabilityObservationIds",
          "availabilityObservationIds",
          "providerProductIds",
          "priceRateIds"
        ],
        "type": "object"
      },
      "ParableProblemRuntimeModelRoute": {
        "properties": {
          "adapter": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "allowFallbacks": {
            "type": "boolean"
          },
          "allowedProviderSlugs": {
            "items": {
              "type": "string"
            },
            "minItems": 0,
            "type": "array"
          },
          "denyProviderDataCollection": {
            "type": "boolean"
          },
          "requireParameters": {
            "type": "boolean"
          },
          "requireZeroDataRetention": {
            "type": "boolean"
          },
          "routeModelId": {
            "type": "string"
          }
        },
        "required": [
          "adapter",
          "routeModelId",
          "requireZeroDataRetention",
          "denyProviderDataCollection",
          "requireParameters",
          "allowFallbacks",
          "allowedProviderSlugs"
        ],
        "type": "object"
      },
      "ParableProblemStageEnum": {
        "enum": [
          "ping",
          "planned",
          "processing",
          "proving"
        ],
        "type": "string"
      },
      "ParableProblemStateEnum": {
        "description": "Where a Problem stands, read from the work that answers it (PARABLE-6851).\nThe server derives it on every read and stores nothing. The first rule that\nholds wins, in this order:\n- published: the Problem's set of Changes is in a published Release. For a\nParable's root Problem, the Parable has a published Release.\n- proven: every Proof of the Problem that applies has passed, and at least\none has passed. A Proof judged not applicable is not counted. PARABLE-6330\nmakes Ponder loop until the Proofs pass.\n- proposed: the Problem's set of Changes is proposed for review.\n- processing: anything else, including a Problem with no Changes yet.",
        "enum": [
          "processing",
          "proposed",
          "proven",
          "published"
        ],
        "type": "string"
      },
      "ParableProblemSummaryDefinition": {
        "description": "Stable fields needed to choose a Problem thread. Contexts, relationships,\nresponsibilities, proofs, Messages, and Runs belong to the detail\nread; putting them here turned one picker page into a hydration stack per row.",
        "properties": {
          "createdBy": {
            "description": "The person who started the Problem. Null for a root Problem the Parable made.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableActorRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isPrimary": {
            "type": "boolean"
          },
          "lifecycle": {
            "$ref": "#/components/schemas/ParableProblemLifecycleEnum"
          },
          "name": {
            "type": "string"
          },
          "parentProblemId": {
            "description": "The Problem this one sits under, from its catalog Parent relationship.\nNull for a Parable's root Problem, and for an older Problem that the tree\nbackfill could not place. Null too when the reader cannot see the parent.\nThe tree read names the parent it placed the Problem under: the root, for\na Problem that the root cannot reach.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "prominence": {
            "$ref": "#/components/schemas/ParableProblemProminenceEnum"
          },
          "proposalId": {
            "description": "The set of Changes that answers this Problem, one to one. Null when it\nhas none, or when its set was deleted.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "stage": {
            "$ref": "#/components/schemas/ParableProblemStageEnum"
          },
          "workspaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "workspaceId",
          "stage",
          "lifecycle",
          "prominence",
          "isPrimary"
        ],
        "type": "object"
      },
      "ParableProblemSummaryView": {
        "description": "Lightweight list projection; detail hydration is intentionally separate.",
        "properties": {
          "activeRunIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "latestMessageAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "participants": {
            "description": "The people on the thread: who started it first, then everyone who wrote,\nran or answered in it, most recently active first.",
            "items": {
              "$ref": "#/components/schemas/ParableActorSnapshotView"
            },
            "maxItems": 12,
            "minItems": 0,
            "type": "array"
          },
          "problem": {
            "$ref": "#/components/schemas/ParableProblemSummaryDefinition"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "state": {
            "$ref": "#/components/schemas/ParableProblemStateEnum",
            "description": "Where the Problem stands, derived on read from its Changes and Proofs."
          }
        },
        "required": [
          "problem",
          "revision",
          "activeRunIds",
          "state",
          "participants"
        ],
        "type": "object"
      },
      "ParableProblemThreadContext": {
        "properties": {
          "observedRevision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "pieceRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePieceRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "proposalRef": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "observedRevision"
        ],
        "type": "object"
      },
      "ParableProblemTreeView": {
        "description": "Every Problem of one Parable the reader may see, as one tree\n(PARABLE-6851). Parents come before their children, and each item names its\nparent. A Problem whose parent the reader cannot see names no parent. A\nProblem that the root cannot reach is named under the root.",
        "properties": {
          "automaticProblemId": {
            "description": "The Problem Ponder opens when nothing is chosen: the root while it is active.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemSummaryView"
            },
            "maxItems": 500,
            "minItems": 0,
            "type": "array"
          },
          "people": {
            "description": "Everyone the items name as their starter or on their thread.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemPersonView"
            },
            "minItems": 0,
            "type": "array"
          },
          "rootProblemId": {
            "description": "The Parable's root Problem. Every other Problem sits under it.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "truncated": {
            "description": "True when the Parable holds more Problems than one read returns.",
            "type": "boolean"
          }
        },
        "required": [
          "items",
          "truncated",
          "people"
        ],
        "type": "object"
      },
      "ParableProblemVisibilityLevelEnum": {
        "enum": [
          "awareness",
          "full"
        ],
        "type": "string"
      },
      "ParableProofEvaluation": {
        "description": "Immutable evidence result contract. No evaluation is different from NOT_APPLICABLE.",
        "properties": {
          "evaluatedAgainst": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          },
          "evaluatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "evaluatedBy": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "notes": {
            "description": "Markdown text",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "outcome": {
            "$ref": "#/components/schemas/ParableProofOutcomeEnum"
          },
          "proofId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "proofRevision": {
            "$ref": "#/components/schemas/ParableProblemProofRevisionRef"
          }
        },
        "required": [
          "id",
          "proofId",
          "proofRevision",
          "evaluatedAgainst",
          "outcome",
          "evaluatedBy",
          "evaluatedAt"
        ],
        "type": "object"
      },
      "ParableProofOutcomeEnum": {
        "enum": [
          "not_applicable",
          "failed",
          "passed"
        ],
        "type": "string"
      },
      "ParableProposalCloseReasonEnum": {
        "description": "Why a Proposal was closed. The withdraw command was removed with the fifth\nstate it named (PARABLE-1469 leaves four), so Discarded is the only reason.",
        "enum": [
          "discarded"
        ],
        "type": "string"
      },
      "ParableProposalCommandInput": {
        "properties": {
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ParableProposalCommandResult": {
        "properties": {
          "proposal": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalRecordView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          }
        },
        "required": [
          "receipt"
        ],
        "type": "object"
      },
      "ParableProposalConflictView": {
        "description": "One reason a stale proposal could not be moved onto the newly Published version.\nThe message is the sentence a reader is shown; the entity pair addresses the Piece it\nis about, and is null for a reason that is about the set as a whole.",
        "properties": {
          "code": {
            "$ref": "#/components/schemas/ParablePrepareFindingCodeEnum"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "entityKind": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableEntityKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "message"
        ],
        "type": "object"
      },
      "ParableProposalProposableDeltaStateEnum": {
        "description": "Server-derived readiness of the explicit Proposal's current authored delta.",
        "enum": [
          "proposable",
          "no_delta",
          "refresh_required",
          "blocked"
        ],
        "type": "string"
      },
      "ParableProposalProposableDeltaView": {
        "description": "Actionable Propose readiness. Clients render this result and never infer an\nempty Proposal or stale transition by diffing packages locally.",
        "properties": {
          "disabledReason": {
            "description": "Plain-language next action when state is not PROPOSABLE.",
            "nullable": true,
            "type": "string"
          },
          "refusalCode": {
            "description": "Structured refusal code; NO_DELTA uses PA-AU-034 (NOTHING_TO_PROPOSE).",
            "maxLength": 50,
            "nullable": true,
            "pattern": "^[A-Z_][A-Z0-9_]*$",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/ParableProposalProposableDeltaStateEnum"
          }
        },
        "required": [
          "state"
        ],
        "type": "object"
      },
      "ParableProposalReadStageEnum": {
        "description": "The four states of a Proposal (PARABLE-1469, \"The states\").\nDerived, never stored: `ProposalStage` in read_contract.go is the only place\nthat answers it, folding the stored (state, closedAt, archivedAt, headCommit)\ntuple into one value. So retyping this is a wire change and needs no row\nbackfill -- there is no column holding these strings and no CHECK to widen.\nThe two renames from the shipped set, each of which was naming the mechanism\nrather than the state:\nPAST     -\u003e PUBLISHED  it is not \"in the past\", it was accepted into the line\nARCHIVED -\u003e POCKETED   the Pocket is restorable; \"archived\" reads terminal\nand collided with archiving a Parable, a different act\nThere is no fifth. The state the shipped set had beyond these four existed\nonly to be the thing Continue operated on, and Continue is gone, so it goes\nwith it: a Proposal its author stops working on is Pocketed and restorable.\nPeeking is deliberately absent. It is a lens that cuts across these four\nrather than a fifth sitting beside them.",
        "enum": [
          "pending",
          "proposed",
          "published",
          "pocketed"
        ],
        "type": "string"
      },
      "ParableProposalRecordView": {
        "properties": {
          "actorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "actorKind": {
            "$ref": "#/components/schemas/ParableActorKindEnum"
          },
          "archivedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "author": {
            "$ref": "#/components/schemas/ParableActorSnapshotView"
          },
          "availableActions": {
            "description": "Every action whose subject is THIS Proposal, each saying whether it can run\nand why not. The line-level rows stay on ParablePrimaryView.\nThe split is not cosmetic. A refusal has to name the thing that must change,\nand two of the commonest refusals on these rows -- this Proposal is someone\nelse's, this Proposal collides with what was published under it -- are\nanswerable only where the author and the conflicts are, which is here. The\nline-level view has no Proposal id, so it can say \"your role does not let you\npublish\" and cannot say \"this Proposal belongs to Dana\" or name a single\ncollision. While these rows sat on the line, the web-app supplied those two\nsentences from its own copy of the rules, and a client copy of a permission\nrule is a second answer that can only disagree with the first.\nRows whose subject is a Proposal that does not exist yet stay on the line.\nOpen is targeted at PROPOSAL and is not state-bound, because it is the act\nthat MAKES one. Splitting on the target alone would move Open here, where it\ncould only ever render beside a Proposal that already exists -- which is the\nscreen it is least needed on, and the one a Published Parable does not have.",
            "items": {
              "$ref": "#/components/schemas/ProductParableActionAvailabilityView"
            },
            "type": "array"
          },
          "baseCommitId": {
            "description": "The Primary commit this set forked from. Written when the set is created, so it is\nthe fork point rather than whatever the Primary happened to hold at Propose time.\nNull only on a set opened before its Parable had any commit timeline, which cannot\nbe stale because nothing has been Published yet.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "changes": {
            "description": "Empty is representable and read_contract.go writes it literally; same\nresponse-validation reading as `conflicts` above (PARABLE-3549).",
            "items": {
              "$ref": "#/components/schemas/ParableChangeItemView"
            },
            "minItems": 0,
            "type": "array"
          },
          "closeReason": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalCloseReasonEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "closedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "conflicted": {
            "description": "True when the move stopped: this set's Patches collide with the newly Published ones.\nA conflicted set stays editable and cannot be Proposed or accepted until its owner\nresolves the collisions listed in `conflicts`.",
            "type": "boolean"
          },
          "conflicts": {
            "description": "Every collision, in plain language. Empty unless `conflicted`.\n`listMin: 0` because empty is the ordinary answer and this view is\nresponse-validated by the generated route: read_contract.go sets\n`record.Conflicts = []` for a clean Proposal, and the Go emitter's reading\nof a required array of length 0 as MISSING turned that into a 500 on the\nPrepare result (PARABLE-3549). PARABLE-3258 is the generator-level fix.",
            "items": {
              "$ref": "#/components/schemas/ParableProposalConflictView"
            },
            "minItems": 0,
            "type": "array"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "headCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "prepare": {
            "description": "The conflict check for this Proposal, as the server computed it.\nNON-NULL for every Proposal in `proposed`, and null in every other stage. That\ninvariant is the whole point of the field: absence used to be the only thing a\nreader could see when nothing had run a Prepare yet, so the client turned\n\"no view\" into \"the check has not finished, wait for it to load\" and disabled\nPublish behind a load that had already finished. There is no waiting state\nhere. A set with nothing to resolve says so -- `prepareRequired: false` with an\nempty `findings` -- rather than saying nothing.\nNull in the other stages because there is nothing to check: a Pending set has\nnot been sealed against anything, a Pocketed one has been taken out of the\nrunning, and a Published one has already landed.\nReading it is NOT the act. Running a Prepare stays the author's alone\n(PARABLE-1916 gates it at the route, at Store.PrepareRead and at both write\npaths); this is the VERDICT, which every seated reader can already see through\n`ParablePrimaryView.policyHealth`. A reviewer who may Publish somebody else's\nset has to be able to see whether that set is clean, and Publish is\ndeliberately not author-gated at any layer.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePrepareView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "problemId": {
            "description": "The Problem this set of Changes answers, one to one (PARABLE-6851). Null\nfor a set that no Problem holds. A Pull, a Versioned setting's own set and\na set opened outside Ponder with no problemId hold none. Neither does a\nset opened before Problems held Changes.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "proposableDelta": {
            "$ref": "#/components/schemas/ParableProposalProposableDeltaView",
            "description": "Server-derived Propose readiness for this exact Proposal revision."
          },
          "proposalVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "reviewHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "reviewSchemaEpoch": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "reviewedRefVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceDeliveryId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceRefVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "stage": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalReadStageEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "stale": {
            "description": "True when a Publish has landed on this Primary since this set forked, so baseCommitId\nis no longer the Primary's current commit. A clean stale set is moved forward\nautomatically by that Publish, so a set that stays stale is a set that could not move.",
            "type": "boolean"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "description": "The version this set BECAME when it was Published, re-read onto the record so a\nPublished Patch can be rendered as `v1.1+3` rather than as its author's name.\nNon-null only in the Published stage. `headCommitId` above cannot stand in for it:\nthat is the head of the set's OWN ref, the commit Propose sealed, and the commit\nthat lands on the line is a different row minted at Publish which points back at it\nthrough `reviewedCommit`. The server walks that edge; nothing on the client can.\nThe whole summary rather than an id or three loose integers, for the reasons\n`ParableProposalSummaryView.version` gives: it is the projection that already\nexists, and it carries the server-computed `latest` so no reader recomputes it.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableVersionSummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "id",
          "rootRefId",
          "sourceRefId",
          "sourceRefVersion",
          "stale",
          "conflicted",
          "conflicts",
          "actorKind",
          "author",
          "changes",
          "proposableDelta",
          "availableActions",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "ParableProposalRef": {
        "properties": {
          "proposalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "proposalId",
          "refId",
          "refRevision"
        ],
        "type": "object"
      },
      "ParableProviderGroup": {
        "description": "One group of Providers a Parable reads (PARABLE-6343), compiled from the\n`providers` of its Home Page's Perception. Every Parable declares its\nProviders in this one structure; a Provider can be in several groups.",
        "properties": {
          "choice": {
            "$ref": "#/components/schemas/ParableProviderGroupChoiceEnum",
            "description": "How many of its Providers a Workspace connects."
          },
          "description": {
            "description": "What the group's Providers add to the Parable, in a sentence.",
            "type": "string"
          },
          "key": {
            "description": "The group's name in the Perception's `providers`, such as `code`.",
            "type": "string"
          },
          "providers": {
            "description": "Its Providers by catalog name, as Plot SQL names them: `github` in\n`providers.github.commits`. In the order declared, none repeated.",
            "items": {
              "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
              "maxLength": 255,
              "minLength": 1,
              "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
              "type": "string"
            },
            "type": "array"
          },
          "role": {
            "$ref": "#/components/schemas/ParableProviderGroupRoleEnum",
            "description": "Required to Populate, or Improves the Parable."
          },
          "title": {
            "description": "What the group is, in a reader's words, such as `Code`.",
            "type": "string"
          }
        },
        "required": [
          "key",
          "title",
          "description",
          "role",
          "choice",
          "providers"
        ],
        "type": "object"
      },
      "ParableProviderGroupChoiceEnum": {
        "description": "How many of a Provider group's Providers a Workspace connects (PARABLE-6343).\natLeastOne  One or more; each adds to the others.\natMostOne   None or one; they are alternatives that must not be mixed.\nexactlyOne  One; they are alternatives, and the group needs one.",
        "enum": [
          "atLeastOne",
          "atMostOne",
          "exactlyOne"
        ],
        "type": "string"
      },
      "ParableProviderGroupRoleEnum": {
        "description": "What a Provider group is for in its Parable (PARABLE-6343). A Parable\ndeclares its groups on its Home Page's Perception (`providers`).\npopulate  Required to Populate: the Parable shows nothing useful until\nthe group's choice rule is met.\nimprove   Improves the Parable: the Parable reads without it and adds\nwhat it holds once connected.",
        "enum": [
          "populate",
          "improve"
        ],
        "type": "string"
      },
      "ParableProviderTableReference": {
        "description": "Stable identities from the Provider catalog, independent of SQL names/aliases.",
        "properties": {
          "providerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "providerKey",
          "tableKey"
        ],
        "type": "object"
      },
      "ParablePublishContextEnum": {
        "description": "Which line a publish is happening on. The two members were `template` and\n`instance` until PARABLE-1469 collapsed both into ParableDeployment; they now\nspell the same distinction ParableDeploymentScopeEnum does, with the same\nvalues, so a reader holding one can compare it to the other.",
        "enum": [
          "parableAdmin",
          "tenant"
        ],
        "type": "string"
      },
      "ParableRaciInput": {
        "properties": {
          "actorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "actorKind": {
            "$ref": "#/components/schemas/ParableActorKindEnum"
          },
          "role": {
            "$ref": "#/components/schemas/ParableRaciRoleEnum"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableActorSelectionScopeEnum"
          }
        },
        "required": [
          "role",
          "actorKind",
          "actorId",
          "scope"
        ],
        "type": "object"
      },
      "ParableRaciRoleEnum": {
        "enum": [
          "responsible",
          "accountable",
          "consulted",
          "informed"
        ],
        "type": "string"
      },
      "ParableRealtimeCursorView": {
        "description": "The Workspace's newest realtime fact cursor. A page that reads it before its\ndata opens its realtime connection after it, so the hub replays only facts\nrecorded since that read instead of asking for a full reload.",
        "properties": {
          "workspaceCursor": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "workspaceCursor"
        ],
        "type": "object"
      },
      "ParableRealtimeProtocolEnum": {
        "enum": [
          "parable.realtime.v1"
        ],
        "type": "string"
      },
      "ParableRealtimeTicketView": {
        "properties": {
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "protocol": {
            "$ref": "#/components/schemas/ParableRealtimeProtocolEnum"
          },
          "ticket": {
            "type": "string"
          }
        },
        "required": [
          "ticket",
          "protocol",
          "expiresAt"
        ],
        "type": "object"
      },
      "ParableRecurrencePreviewInput": {
        "description": "The next few times a recurrence fires, computed server-side.\nOne engine expands: the parable-recurrence Rust crate (PARABLE-4443), which\nquery-runner links to schedule Report plans and the Go APIs call through the\nparable-compose FFI to answer this preview. It stays out of scalar-lib, whose\ncore ships to the browser, the Python wheel and the Node addon, so chrono-tz's\nIANA data does not ride along to them. The browser validates the RULE\n(grammar, through scalar-lib) and asks the server for OCCURRENCES, so the\npreview and the scheduler cannot disagree.",
        "properties": {
          "anchorAt": {
            "description": "The anchor and the zone, which the rule cannot carry. RFC 5545 puts the zone\non DTSTART and we do not store one, so \"09:00\" is ambiguous across a DST\nboundary without these two.",
            "format": "date-time",
            "type": "string"
          },
          "count": {
            "description": "How many to return. The server caps this; see the view.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "recurrence": {
            "description": "RFC 5545 RRULE, without DTSTART.",
            "maxLength": 512,
            "minLength": 6,
            "type": "string"
          },
          "timezone": {
            "description": "IANA tz database name: UTC, GMT, or two or more '/'-separated segments of ASCII letters, digits, '_', '-', and '+', each starting with a letter (e.g., America/New_York, America/Port-au-Prince, Etc/GMT+5). Checks the name's shape, not that a tz release lists it.",
            "maxLength": 100,
            "pattern": "^(?:UTC|GMT|[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z][A-Za-z0-9_+-]*)+)$",
            "type": "string"
          }
        },
        "required": [
          "recurrence",
          "anchorAt",
          "timezone",
          "count"
        ],
        "type": "object"
      },
      "ParableRecurrencePreviewView": {
        "properties": {
          "occurrences": {
            "description": "The next occurrences, in order, in the requested zone.\nSHORTER than `count` is normal and meaningful: a COUNT-limited rule can be\nexhausted, and a rule can have no match at all inside the search window (a\n31st of February). Empty is an answer, not an error.",
            "items": {
              "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
              "format": "date-time",
              "type": "string"
            },
            "type": "array"
          },
          "truncationReason": {
            "description": "Why the list is short, when it is. Rendered as-is beneath the preview.\nExpansion is bounded on purpose: `COUNT=999999999` and rules that never\nmatch would otherwise walk forever, so the server stops after a fixed window\nand says so here rather than returning a truncated list that looks complete.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "occurrences"
        ],
        "type": "object"
      },
      "ParableReleaseLevelEnum": {
        "description": "The number a published Version takes (PARABLE-5721). Versions are numbered\nmajor.minor, such as 1.83.\nminor  The next minor number: 1.83 becomes 1.84.\nmajor  The next major number: 1.83 becomes 2.0. A line that follows an\nupstream cannot take one.",
        "enum": [
          "minor",
          "major"
        ],
        "type": "string"
      },
      "ParableReleaseStageEnum": {
        "description": "Release stage for connector offerings.\nDetermines visibility and access in the connector catalog.",
        "enum": [
          "ga",
          "early_access",
          "invite_access",
          "coming_soon"
        ],
        "type": "string"
      },
      "ParableRenderBuild": {
        "description": "Immutable compilation of a source tree, reusable before and after publication.",
        "properties": {
          "compilerVersion": {
            "type": "string"
          },
          "failures": {
            "description": "The Pages and Panes that did not compile; none of them is in `modules`.\nAbsent when every one compiled.",
            "items": {
              "$ref": "#/components/schemas/ParableRenderModuleFailure"
            },
            "nullable": true,
            "type": "array"
          },
          "modules": {
            "items": {
              "$ref": "#/components/schemas/ParableRenderModule"
            },
            "type": "array"
          },
          "sourceHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "sourceHash",
          "compilerVersion",
          "modules"
        ],
        "type": "object"
      },
      "ParableRenderImport": {
        "description": "One runtime module a compiled Page or Pane imports, read from the compiled\noutput. The renderer loads a library's code only for the modules that import\nit.",
        "properties": {
          "names": {
            "description": "The names the module takes from it, or `*` when it takes the whole module\n(a namespace import, `export *` or `require`). Empty for an import made\nonly for its side effects.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "specifier": {
            "description": "The bare specifier the renderer provides, such as `parable/panes/placeholders` or `three`.",
            "type": "string"
          }
        },
        "required": [
          "specifier",
          "names"
        ],
        "type": "object"
      },
      "ParableRenderModule": {
        "description": "Executable output for one authored Page or Pane; host data is supplied at runtime.",
        "properties": {
          "imports": {
            "description": "Every runtime module the compiled `javascript` imports.",
            "items": {
              "$ref": "#/components/schemas/ParableRenderImport"
            },
            "type": "array"
          },
          "javascript": {
            "type": "string"
          },
          "pieceKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "stylesheet": {
            "type": "string"
          }
        },
        "required": [
          "pieceKey",
          "javascript",
          "stylesheet",
          "imports"
        ],
        "type": "object"
      },
      "ParableRenderModuleFailure": {
        "description": "A Page or Pane that did not compile. Each Page and Pane compiles alone, so the\nbuild still carries every other module: the renderer draws them and shows\nthis message where the failed one would be.",
        "properties": {
          "diagnostics": {
            "description": "Every error with its position. The build cache keeps them in the text the\ncompiler read; a package read moves them onto the reader's own text (the\nsame errors as `sourceLint[].build`), and empties them for a reader who\ncannot see the source.",
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintDiagnostic"
            },
            "type": "array"
          },
          "message": {
            "description": "The first error, one line, as the renderer shows it in the Pane's place.",
            "type": "string"
          },
          "pieceKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "pieceKey",
          "message",
          "diagnostics"
        ],
        "type": "object"
      },
      "ParableReport": {
        "description": "A Report and its Plans compose like any other overlay entity, so an admin line\ncan publish a schedule a Workspace inherits and overrides.",
        "properties": {
          "deletedOnRef": {
            "type": "boolean"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "handlePinned": {
            "type": "boolean"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "order": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "entityKey",
          "deletedOnRef",
          "order",
          "name",
          "handle",
          "handlePinned",
          "enabled"
        ],
        "type": "object"
      },
      "ParableReportContextView": {
        "description": "What a page needs about a Parable's Refreshes when it opens.\nLatest is one Refresh: the newest completed Refresh whose Release is in the\nsame major line as the Release being read (`latestRunId`). Every stored Plot\non the page reads its output from that Refresh. A minor or patch Release\nreads the Refreshes of earlier Releases in its major line. A major Release\nneeds a Refresh of its own major line.\nThe page does not get the run history. The Refresh menu and a Plot's History\nread it in pages (`ParableReportRunPage`) when they open.",
        "properties": {
          "catalogSlug": {
            "description": "The Parable's catalog slug. SQL reads a Plot's newest completed output at\n`parables.{catalogSlug}.{plot slug}`, so History and Details name it.",
            "maxLength": 255,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "currentDisabledReason": {
            "description": "Empty when Latest can be read. Otherwise why not: the reading has stored\nPlots and its major line has no completed Refresh.",
            "type": "string"
          },
          "latestRunId": {
            "description": "The Refresh Latest reads on this reading. Null when the major line of the\nRelease being read has no completed Refresh.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "runs": {
            "description": "The runs the page needs now, newest first: the newest run, each run that\nhas not ended, the Refresh Latest reads, the newest completed Refresh,\nand the run the read names in `runId` when the line has it. Empty when\nthe line has no run.",
            "items": {
              "$ref": "#/components/schemas/ParableReportRunView"
            },
            "type": "array"
          }
        },
        "required": [
          "runs",
          "currentDisabledReason"
        ],
        "type": "object"
      },
      "ParableReportLiveSourcesView": {
        "description": "How each Provider a Parable reads stands now (PARABLE-5665): the Refresh\nmenu's Latest, read when the menu opens. The Providers are the ones the\nline's newest recorded Refresh read; each comes with its connection's\ncurrent status and, through the Query Layer, when the newest version of\nits Pool tables was committed.",
        "properties": {
          "sources": {
            "items": {
              "$ref": "#/components/schemas/ParableReportSourceView"
            },
            "type": "array"
          }
        },
        "required": [
          "sources"
        ],
        "type": "object"
      },
      "ParableReportPinnedOutput": {
        "description": "A Pipeline of another Parable that a member Plot reads, pinned when the run\nis captured (PARABLE-5760). It names the newest COMPLETE, retained Report\nrun of that Parable that completed at or before the run's AS OF time and\nwhose output fits the Pipeline's publication. A Refresh of that Parable\nthat completes later, while this run waits to plan, never changes what the\nrun reads.",
        "properties": {
          "parableId": {
            "description": "ProductParable.id of the Pipeline's Parable.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotKey": {
            "description": "ParablePlot.entityKey of the Pipeline.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refresh": {
            "description": "The Refresh the member reads. Null when that Parable had none completed\nby the run's AS OF time: the member reads the Pipeline as an empty table,\nrecorded under the pin set's emptyInputs with reason never_written.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportPinnedRefresh"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "parableId",
          "plotKey"
        ],
        "type": "object"
      },
      "ParableReportPinnedRefresh": {
        "description": "The output of one Refresh of another Parable that a Report run reads\n(PARABLE-5760). Capture copies these fields from that Plot result's\nParableReportPlotOutput. Both are written once and never change, so the\ncopy cannot drift; the run keeps it so every plan and every restart reads\nthis table at this version without asking web-db again.",
        "properties": {
          "commitDigest": {
            "description": "SHA-256 of the commit JSON that created deltaVersion.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "deltaVersion": {
            "description": "The Delta version that query run committed.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "queryRunId": {
            "description": "query.query_runs.id of the query run that wrote the table.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reportRunId": {
            "description": "ParableReportRun.id of the Refresh.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tableUri": {
            "description": "The Refresh's output table, `.../parables/{parable}/_outputs/{plot}/{query_run}`.",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          }
        },
        "required": [
          "reportRunId",
          "queryRunId",
          "tableUri",
          "deltaVersion",
          "commitDigest"
        ],
        "type": "object"
      },
      "ParableReportPlan": {
        "properties": {
          "afterSources": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportPlanAfterSources"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "anchorAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "deletedOnRef": {
            "type": "boolean"
          },
          "enabled": {
            "type": "boolean"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "order": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "recurrence": {
            "description": "Null for a plan that runs only after its sources (afterSources).",
            "maxLength": 512,
            "minLength": 6,
            "nullable": true,
            "type": "string"
          },
          "reportKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "timezone": {
            "description": "IANA tz database name: UTC, GMT, or two or more '/'-separated segments of ASCII letters, digits, '_', '-', and '+', each starting with a letter (e.g., America/New_York, America/Port-au-Prince, Etc/GMT+5). Checks the name's shape, not that a tz release lists it.",
            "maxLength": 100,
            "pattern": "^(?:UTC|GMT|[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z][A-Za-z0-9_+-]*)+)$",
            "type": "string"
          }
        },
        "required": [
          "entityKey",
          "deletedOnRef",
          "reportKey",
          "order",
          "enabled",
          "timezone"
        ],
        "type": "object"
      },
      "ParableReportPlanAfterSources": {
        "description": "When a Report plan refreshes after its sources refresh (PARABLE-5748). The\nsources are the Provider taps the plan's Pipelines read and the other\nParables whose Pipelines they read. query-runner decides when a plan is\ndue: it waits until no source has changed for quietMinutes, or until the\noldest unfired change is maxDelayMinutes old, and fires at most maxPerDay\ntimes a day in the plan's timezone. A plan may also have a recurrence; a\nplan with neither is not scheduled.\n\nIt lives here, in the General package under web-db, for the reason the Plot\ncaps do: web-db stores it as a JSON column on parable_report_plan, and the\nroster, the archive and the Workspace reads carry the same shape.",
        "properties": {
          "enabled": {
            "description": "Off keeps the other settings, so switching it back on restores them.",
            "type": "boolean"
          },
          "maxDelayMinutes": {
            "description": "The longest a change waits: a steady stream of changes still fires once\nthe oldest unfired change is this old. At least quietMinutes.",
            "format": "int64",
            "maximum": 10080,
            "minimum": 5,
            "type": "integer"
          },
          "maxPerDay": {
            "description": "The most times the plan fires after its sources in one day.",
            "format": "int64",
            "maximum": 24,
            "minimum": 1,
            "type": "integer"
          },
          "quietMinutes": {
            "description": "How long the sources must stay unchanged before the plan fires.",
            "format": "int64",
            "maximum": 1440,
            "minimum": 5,
            "type": "integer"
          }
        },
        "required": [
          "enabled",
          "quietMinutes",
          "maxDelayMinutes",
          "maxPerDay"
        ],
        "type": "object"
      },
      "ParableReportPlanAuthority": {
        "description": "What a Report query run's plan read under its execution context (PARABLE-4446):\nthe protected sources, with the digest a reader re-checks before serving the\nrun's output.",
        "properties": {
          "authorityDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "sourceAuthorities": {
            "items": {
              "$ref": "#/components/schemas/ParableReportSourceAuthority"
            },
            "type": "array"
          }
        },
        "required": [
          "sourceAuthorities",
          "authorityDigest"
        ],
        "type": "object"
      },
      "ParableReportPlanParableSourceView": {
        "description": "One other Parable a Report plan that refreshes after its sources watches\n(PARABLE-5764): a Parable whose Plots the line's Pipelines read through its\npublished Plot dependency edges.",
        "properties": {
          "latestCompleteAt": {
            "description": "When its newest complete Refresh completed. Null when it has none, and\nfor a Parable the reader may not see.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "Its name. Empty for a Parable the reader may not see.",
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "parableId",
          "name"
        ],
        "type": "object"
      },
      "ParableReportPlanProviderSourceView": {
        "description": "One Provider connection a Report plan that refreshes after its sources\nwatches (PARABLE-5764): the connections whose taps the line's newest Refresh\nread, as the Report plan roster computes them.",
        "properties": {
          "logoUrl": {
            "description": "The Provider's logo in the catalog. Null when the catalog has none.",
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "The connection's name, as the Providers directory shows it.",
            "type": "string"
          },
          "tapCount": {
            "description": "How many of the connection's taps the plan watches.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "tenantConnectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantConnectorId",
          "name",
          "tapCount"
        ],
        "type": "object"
      },
      "ParableReportPlanSourcesView": {
        "description": "What a Report plan of this line would watch with Refresh after sources on\n(PARABLE-5764), read from the line's published Version as the Report plan\nroster reads it. Plan Refreshes lists it.",
        "properties": {
          "parables": {
            "items": {
              "$ref": "#/components/schemas/ParableReportPlanParableSourceView"
            },
            "type": "array"
          },
          "providers": {
            "items": {
              "$ref": "#/components/schemas/ParableReportPlanProviderSourceView"
            },
            "type": "array"
          },
          "published": {
            "description": "False when the line has published nothing: a plan runs only once published.",
            "type": "boolean"
          }
        },
        "required": [
          "published",
          "providers",
          "parables"
        ],
        "type": "object"
      },
      "ParableReportPlotOutput": {
        "description": "One Plot's output of one Report run on query-runner (PARABLE-4449): the Delta\ntable the Plot's query run wrote once under its own prefix, which nothing\nrewrites, VACUUMs or compacts. The descriptor names immutable bytes: the\ncommit that created `deltaVersion` hashes to `commitDigest`. Stored\nprovenance never grants access.",
        "properties": {
          "authorityDigest": {
            "description": "Current input authority must still match before historical data is served.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "commitDigest": {
            "description": "SHA-256 of the commit JSON that created `deltaVersion`.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "contentDigest": {
            "description": "What the table's rows hold, whatever their order and however they split\ninto files (PARABLE-5756): the query run's `outputContentDigest`, SHA-256\nover the row count, the output schema and the sum of each row's 128-bit\nhash. Two outputs with one digest hold the same rows, so a Pipeline that\nreads this output can tell its input did not change when the Plot reran.\nNull on outputs recorded before it, and when the finale recorded none.",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "context": {
            "$ref": "#/components/schemas/ParableContext",
            "description": "The Report run's captured execution context: the principal the output was produced under."
          },
          "contractHash": {
            "description": "Producer Perception contract and SQL digest, compiled from the Report run's\ncaptured publication when the output was recorded.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "deltaVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "inputHydration": {
            "type": "string"
          },
          "inputLineage": {
            "description": "Canonical DataFusion PinSet the query run planned under, serialized by its owning Rust model."
          },
          "inputValidation": {
            "description": "Exact compiler JSON text, preserved byte-for-byte through storage and transport.",
            "type": "string"
          },
          "outputHydration": {
            "type": "string"
          },
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "outputValidation": {
            "type": "string"
          },
          "plotKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "queryRunId": {
            "description": "query.query_runs.id of the Plot result's query run. It wrote the table,\nunless reusedFromQueryRunId names the earlier query run that did.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reusedFromQueryRunId": {
            "description": "The query run that wrote `tableUri`, when this result's query run reused\nthat output instead of executing (PARABLE-5765): nothing that decides the\nrows had changed. The table lives under that query run's `_outputs/`\npath, and retention keeps it while any retained result names it\n(PARABLE-5766). Null when the result's own query run wrote the table.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rowCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "runId": {
            "description": "ParableReportRun.id.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceAuthorities": {
            "items": {
              "$ref": "#/components/schemas/ParableReportSourceAuthority"
            },
            "type": "array"
          },
          "sourceHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "sourceImplementationId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceImplementationVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "tableUri": {
            "description": "Server-derived table root under the Workspace's `_outputs/{plot}/` prefix; never accepted from authored code.",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "vectorSiblings": {
            "description": "Retired (EDR-0083, amended 2026-10-05): always empty. Optional so a reader\naccepts an output without it; web-api still writes `[]` for readers built\nbefore this change. The next step deletes the field.",
            "items": {
              "$ref": "#/components/schemas/ParableReportVectorSibling"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "runId",
          "queryRunId",
          "plotKey",
          "sourceImplementationId",
          "sourceImplementationVersion",
          "context",
          "contractHash",
          "sourceHash",
          "inputValidation",
          "outputValidation",
          "inputHydration",
          "outputHydration",
          "tableUri",
          "deltaVersion",
          "commitDigest",
          "rowCount",
          "outputSchema",
          "inputLineage",
          "sourceAuthorities",
          "authorityDigest"
        ],
        "type": "object"
      },
      "ParableReportPlotResultStatusEnum": {
        "description": "The outcome of running one Plot inside one report run.\n\nSeparate from ParableReportRunStatus, which is the whole run. A run is\nCOMPLETE only when every Plot in it is COMPLETE; one FAILED or CANCELLED Plot\nmakes the whole run unreadable. The per-Plot status says which Plot stopped\nit and how far each of the others got (PARABLE-4448).",
        "enum": [
          "pending",
          "running",
          "budget_exceeded",
          "complete",
          "failed",
          "cancelled",
          "skipped"
        ],
        "type": "string"
      },
      "ParableReportPlotResultView": {
        "description": "One Plot's outcome inside one run, pinned to the exact sealed image it ran.",
        "properties": {
          "completedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "errorMessage": {
            "description": "A product message for a failed, cancelled or budget-paused Plot.",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "maxCost": {
            "description": "The caps the Plot's query run runs under: its published caps when the run\nwas captured, or the caps a Raise budget set since (PARABLE-4451). Null\nmeans none was set and query-runner applied its default, which this view\ncannot name.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotCostCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxExternalCalls": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotExternalCallsCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "plotEntityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotEntityVersion": {
            "description": "The sealed version of the Plot that ran, so editing it later cannot rewrite\nwhat happened. `plotName` is captured for the same reason: a rename must not\nretitle history.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "plotName": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "reusedFrom": {
            "description": "The earlier Refresh this Plot's output was reused from, when its query\nrun found its inputs unchanged and completed as that output without\nrunning (PARABLE-5765). Its spend is then zero. Null when the Plot ran.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportReuseView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "rowCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "rowCountHidden": {
            "description": "True when the reader may not see this Plot's row count; `rowCount` is then\nabsent. psgen emits a nullable Int64 as a bare int64 that omits zero, so a\nhidden count and a real zero look the same on the wire without this flag.",
            "type": "boolean"
          },
          "spentCalls": {
            "format": "double",
            "type": "number"
          },
          "spentCost": {
            "description": "What the Plot's run has spent so far: cost in the smallest currency unit,\nand paid external calls. Updated with each status change, not live.",
            "format": "double",
            "type": "number"
          },
          "startedAt": {
            "description": "When the Plot started and finished running. Null until each happens.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ParableReportPlotResultStatusEnum"
          },
          "updatedAt": {
            "description": "When this result last changed: the latest status change applied to it.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "plotEntityKey",
          "plotEntityVersion",
          "plotName",
          "status",
          "updatedAt",
          "rowCountHidden",
          "spentCost",
          "spentCalls"
        ],
        "type": "object"
      },
      "ParableReportReuseView": {
        "description": "The earlier Refresh whose output a Plot result reuses (PARABLE-5765): the\nRefresh whose query run wrote the rows. History reads \"Reused from\" it.",
        "properties": {
          "occurredAt": {
            "description": "When that Refresh was pressed or fired, as its own History row shows it.",
            "format": "date-time",
            "type": "string"
          },
          "preview": {
            "description": "True when that run was a Preview (PARABLE-6346). Only a Preview reuses a\nPreview's output: a Preview's run key includes its sample, so a Refresh\nnever names one.",
            "type": "boolean"
          },
          "reportRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "reportRunId",
          "occurredAt",
          "preview"
        ],
        "type": "object"
      },
      "ParableReportRunEnqueue": {
        "description": "Everything query-runner needs to enqueue one query run per member Plot of a\ncaptured Report run (PARABLE-4445). Built by one Go builder in\nservices/pkg/parable for every caller: web-api and web-admin-api Run, the\ninterim scheduled capture, and later query-runner's own capture and repair\nsweep (PARABLE-4447, PARABLE-4685).",
        "properties": {
          "actorId": {
            "description": "Audit actor for the query_runs rows: the person for MANUAL runs, the\nSystem user for SCHEDULED ones.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "asOf": {
            "description": "ParableReportRun.asOf: every query run of this Report run plans its\ninputs as of this time (PARABLE-4446).",
            "format": "date-time",
            "type": "string"
          },
          "context": {
            "$ref": "#/components/schemas/ParableContext",
            "description": "The Report run's captured execution context: the person for MANUAL runs,\nthe Workspace for SCHEDULED runs. Each query run plans under it."
          },
          "force": {
            "description": "ParableReportRun.forced (PARABLE-5767): Refresh everything. query-runner\nstores it on each query run and reuses no earlier output for them, though\nit still records each one's run key. Null or false reuses an unchanged\nPipeline's output (PARABLE-5765).",
            "nullable": true,
            "type": "boolean"
          },
          "parableId": {
            "description": "ProductParable.id, ProductParable.slug, and the run's published commit:\nParableCommit.publishedSequence and ParableCommit.id.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parablePublishedSequence": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "parableSealedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parableSlug": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "plots": {
            "items": {
              "$ref": "#/components/schemas/ParableReportRunEnqueuePlot"
            },
            "minItems": 1,
            "type": "array"
          },
          "priorityClass": {
            "$ref": "#/components/schemas/QueryPriorityClass",
            "description": "INTERACTIVE for MANUAL runs, SCHEDULED for SCHEDULED runs. query-runner\nrefuses BACKFILL."
          },
          "reportRunId": {
            "description": "web-db ParableReportRun.id. Query runs are idempotent on\n(reportRunId, plotId).",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantSlug": {
            "description": "Tenant.slug of tenantId (PARABLE-4441).",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "reportRunId",
          "tenantId",
          "tenantSlug",
          "actorId",
          "priorityClass",
          "parableId",
          "parableSlug",
          "parablePublishedSequence",
          "parableSealedCommitId",
          "asOf",
          "context",
          "plots"
        ],
        "type": "object"
      },
      "ParableReportRunEnqueuePlot": {
        "description": "One member Plot of a Report run, as captured at the run's published commit.",
        "properties": {
          "contract": {
            "description": "The receipt of the Plot's contract at the run's commit. query-runner\nstores it with the query run, for the finale that writes the Plot's rows\n(PARABLE-5194). Null when the Plot has no compiled contract, and from a\nsender that predates the field.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlotContractReceipt"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxCost": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotCostCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxExternalCalls": {
            "description": "The Plot's caps at the run's commit. Null leaves the cap to query-runner's\nQUERY_RUNNER_DEFAULT_* value, filled at enqueue.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotExternalCallsCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxRuntime": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotRuntimeCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "paneValues": {
            "description": "This Parable's captured values for the Panes this Plot's SQL or a view it\nreads names (PARABLE-6255). query-runner stores them with the query run\nand sends them with every planning request. Null or empty when the Plot\nreads none.",
            "items": {
              "$ref": "#/components/schemas/PaneRelationValues"
            },
            "nullable": true,
            "type": "array"
          },
          "parameters": {
            "description": "The $1, $2, ... values captured from the Plot's plot_sql implementation,\nafter the Plot contract's input normalization. Empty when the SQL has none.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "type": "array"
          },
          "pinnedOutputs": {
            "description": "The Pipelines of other Parables this Plot reads, each pinned at capture\nto one Refresh of its Parable, or to none (PARABLE-5760). query-runner\nstores them with the query run and sends them with every planning\nrequest, so each plan and restart reads exactly these outputs. Null or\nempty when the Plot reads none.",
            "items": {
              "$ref": "#/components/schemas/ParableReportPinnedOutput"
            },
            "nullable": true,
            "type": "array"
          },
          "plotId": {
            "description": "ParablePlot.entityKey.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotSlug": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "publishedSql": {
            "description": "SQL from the Plot's captured plot_sql implementation, hash-checked\nagainst the capture. query-runner runs exactly this text and never\nre-reads the current publication.",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "upstreamPlotIds": {
            "description": "The run's other member Plots this Plot reads. query-runner claims this\nPlot's query run only after each of theirs succeeded, and plans it against\nthe outputs they wrote in this run. Null or empty when it reads none.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "plotId",
          "plotSlug",
          "publishedSql",
          "parameters"
        ],
        "type": "object"
      },
      "ParableReportRunPage": {
        "description": "One page of a line's runs, newest first: the Refresh menu's list and a\nPlot's History. The page read sends no history; these come when the menu or\nHistory opens.",
        "properties": {
          "hasMore": {
            "description": "True when older runs follow this page.",
            "type": "boolean"
          },
          "runs": {
            "description": "The runs of this page. Each has the Plot results the read asked for: the\nresult of the Plot named in `plotKey`, or none.",
            "items": {
              "$ref": "#/components/schemas/ParableReportRunView"
            },
            "type": "array"
          }
        },
        "required": [
          "runs",
          "hasMore"
        ],
        "type": "object"
      },
      "ParableReportRunStatus": {
        "description": "Lifecycle status of a parable report run.\n\nCOMPLETE, FAILED and CANCELLED are terminal: a query_runner run never\nleaves them, and only a COMPLETE run is readable (PARABLE-4448).",
        "enum": [
          "pending",
          "running",
          "complete",
          "failed",
          "cancelled"
        ],
        "type": "string"
      },
      "ParableReportRunTrigger": {
        "description": "How a parable report run was triggered.",
        "enum": [
          "scheduled",
          "manual",
          "sources"
        ],
        "type": "string"
      },
      "ParableReportRunView": {
        "description": "One reading, and the version it read.\n`publishedCommitId` is never a version STRING. Publication numbering is owned\nby ParableCommit and rendered at display time; copying `v2.3` here would be a\nsecond place for it to be wrong.",
        "properties": {
          "completedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "durationMs": {
            "description": "Measured, not derived from the two timestamps: a run whose process dies\nbefore stamping completedAt still knows how long its work took, and\nsubtracting silently reports a negative when a clock moves.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "failureMessage": {
            "nullable": true,
            "type": "string"
          },
          "forced": {
            "description": "Refresh everything (PARABLE-5767): every Pipeline of this run recomputed,\nreusing no earlier output. False for a Refresh, which reuses unchanged\nPipelines, and for every run a Report Plan fires (SCHEDULED or SOURCES).",
            "type": "boolean"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "occurredAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "planKey": {
            "description": "Null when the trigger was MANUAL: somebody pressed Plot, no Plan fired.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotResults": {
            "items": {
              "$ref": "#/components/schemas/ParableReportPlotResultView"
            },
            "type": "array"
          },
          "preview": {
            "description": "True for a Preview (PARABLE-6346): the Report run end to end on a sample\nof the real data. It is never Latest; a reader reads it only by choosing\nit.",
            "type": "boolean"
          },
          "proposalId": {
            "description": "The set of Changes a Preview ran on, by ParableProposal.id. Null on a\nRefresh and on a Preview of a published Version.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "publishedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reportKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "requestedBy": {
            "description": "The person who pressed Run. Null for a SCHEDULED run: no person asked.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableActorSnapshotView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "sources": {
            "items": {
              "$ref": "#/components/schemas/ParableReportSourceView"
            },
            "type": "array"
          },
          "status": {
            "$ref": "#/components/schemas/ParableReportRunStatus"
          },
          "trigger": {
            "$ref": "#/components/schemas/ParableReportRunTrigger"
          },
          "triggerSources": {
            "description": "For a SOURCES Refresh, the source changes that fired it, in the order the\nfire recorded them (PARABLE-5764). Empty for every other trigger.",
            "items": {
              "$ref": "#/components/schemas/ParableReportTriggerSourceView"
            },
            "type": "array"
          },
          "typicalDurationMs": {
            "description": "For a run that has not ended: the median duration of the newest ten\ncompleted runs of its Report of the same kind (Refresh or Preview). The\nprogress bar estimates the time left from it. Absent for a run that has\nended, and for a Report with no completed run of that kind.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "unavailableReason": {
            "description": "Why the reading cannot read this completed Refresh: the Refresh ran for a\nRelease in another major line. Null when the Release being read is in the\nsame major line. This is Release compatibility, not a promise about the\nreader's current access. A Plot that the Refresh did not store, or whose\noutput it stored under another shape, still has no data in it.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "reportKey",
          "publishedCommitId",
          "occurredAt",
          "status",
          "trigger",
          "triggerSources",
          "preview",
          "forced",
          "sources",
          "plotResults"
        ],
        "type": "object"
      },
      "ParableReportSourceAuthority": {
        "description": "Exactly one canonical source reference; the snapshot is emitted by the fixed authority adapter.",
        "properties": {
          "plot": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotOutputReference"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "provider": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProviderTableReference"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "snapshot": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          }
        },
        "required": [
          "snapshot"
        ],
        "type": "object"
      },
      "ParableReportSourceDeliveryEnum": {
        "description": "How a source delivered its data at the moment a report ran.\n\nThis is the freshness question a reader actually asks, and it is not the same\nquestion as ConnectorTap's SyncModeEnum (FULL vs INCREMENTAL), which is about\nhow much a sync moves rather than how continuously it moves.\n\nThe nearest existing field is Connector.integrationClass\n(API|DATABASE|FILE|STREAMING|META_TOOL|CUSTOM), but it is set on only 9 of 48\nconnector definitions and only 3 of those say streaming -- so deriving from it\ntoday would report BATCH for forty connectors nobody classified. UNKNOWN is\nwhat those are, and saying so is the point.",
        "enum": [
          "batch",
          "streaming",
          "unknown"
        ],
        "type": "string"
      },
      "ParableReportSourceView": {
        "description": "WHAT A READER SEES OF A REPORT.\nThe authored side of reporting -- ParableReport and ParableReportPlan -- is\ntwo @versioned entity kinds that ride the ordinary patch machinery and reach\nthe client inside the composed tree, like every other Piece. Nothing here\nduplicates them.\nThese are the OPERATIONAL rows: what happened when a Report ran. They are not\nentity kinds, never appear in a change list, and are read straight rather than\ncomposed, so they need views of their own.\nOne Provider as a Refresh read it, or, for the Refresh menu's Latest, as it\nstands now (PARABLE-5665).\nImmutable history: the ids are captured VALUES rather than relations, so\ndeleting a connector cannot invalidate a reading that already happened.",
        "properties": {
          "connectionStatus": {
            "description": "The connection's status when the run read the Provider, as the Providers\ndirectory settles it (while a sync runs, the status before it). Null when\nthe Workspace had no connection for the Provider.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TenantConnectorStatusEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "connectionStatusMessage": {
            "description": "The raw detail for connectionStatus. The app shows it to staff; others read the status in customer wording.",
            "nullable": true,
            "type": "string"
          },
          "dataAsOf": {
            "description": "When the newest version the run read of the Provider's Pool tables was\ncommitted: how old its data was. Null when the run pinned none.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "delivery": {
            "$ref": "#/components/schemas/ParableReportSourceDeliveryEnum",
            "description": "How the Provider delivers its data, from the catalog's integration class\n(Connector.integrationClass): STREAMING when the connector streams, BATCH\nfor any other class, UNKNOWN when the catalog has not classified it.\nCaptured when the run read the Provider; the Refresh menu's Latest reads\nit from the catalog now. Only a STREAMING Provider whose data is minutes\nold can read \"Updated Live\"."
          },
          "hasData": {
            "description": "Whether the Provider had any data (PARABLE-6300). For a Refresh: true when\nit pinned a version of any of the Provider's Pool tables, false when it\nread every one of them as never written or the Provider as not connected.\nFor Latest: whether the Query Layer reports a commit for any of its\ntables that the reader may read. Null when not known: a Refresh recorded\nbefore PARABLE-6300, or a Latest whose commits could not be read. A\nconnected Provider with false is waiting for its first data, unless\n`streamsOff` names a stream: then it needs the reader.",
            "nullable": true,
            "type": "boolean"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "logoUrl": {
            "description": "The Provider's logo in the catalog, read when the view is built, as the\nProviders pages show it: its grouping's, else its vendor's. Null when the\ncatalog has none.",
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "The product a reader knows, \"Google Workspace\": the catalog's name for the\nconnection's grouping, else its connector's. When the Workspace has more\nthan one connection of the Provider, each row is its connection's own name\ninstead, so the rows can be told apart. A captured value: a Refresh keeps\nthe name it recorded, and a later catalog rename does not rename it. The\nRefresh menu's Latest reads it from the catalog now.",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "provider": {
            "description": "The Provider, by its name in Plot SQL: `zoom` in providers.zoom.meetings (PARABLE-5665).",
            "nullable": true,
            "type": "string"
          },
          "streamsOff": {
            "description": "The Provider's streams the run read while the Workspace had them off, by\nplatform tap name: `replies` in providers.slack.replies (PARABLE-6267).\nThey read as empty, and no data comes until one is turned on, so the\nProvider needs the reader whether or not its other streams had data. For\nLatest: the ones the line's newest Refresh read off that are still off.\nNull when there are none, and for a Refresh recorded before they were\nkept.",
            "items": {
              "description": "A machine identifier for a data tap (lowercase letter, then lowercase alphanumeric or underscores)",
              "maxLength": 80,
              "minLength": 1,
              "pattern": "^[a-z][a-z0-9_]*$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "tenantConnectorId": {
            "description": "The connector this was, by captured id. Not a relation. Null for a\nProvider the run read as empty because the Workspace has not connected it.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "vendorName": {
            "description": "\"Google\", where `name` is \"Google Workspace\". Not a fallback for it.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "delivery"
        ],
        "type": "object"
      },
      "ParableReportTriggerSource": {
        "description": "One source whose change made a Report plan's afterSources fire due\n(PARABLE-5748). query-runner records the facts on the fire, and the Report\nrun it captures keeps them so its History can name what fired it.",
        "properties": {
          "firstCompletedAt": {
            "description": "The earliest and the latest completion of this source the fire counted.\nA Parable source counts one Refresh, so the two are equal.",
            "format": "date-time",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableReportTriggerSourceKind"
          },
          "lastCompletedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "reportRunId": {
            "description": "PARABLE: the ParableReportRun.id of the Refresh that completed at\nlastCompletedAt. Null for a Provider tap.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceId": {
            "description": "PROVIDER_TAP: the TenantConnectorTap.id whose promote completed.\nPARABLE: the ProductParable.id whose Refresh completed.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "sourceId",
          "firstCompletedAt",
          "lastCompletedAt"
        ],
        "type": "object"
      },
      "ParableReportTriggerSourceKind": {
        "description": "What kind of source change made a Report plan's afterSources fire due\n(PARABLE-5748).",
        "enum": [
          "provider_tap",
          "parable"
        ],
        "type": "string"
      },
      "ParableReportTriggerSourceView": {
        "description": "One source change that fired a SOURCES Refresh (PARABLE-5764), named as the\nsource stands now: the Provider connection whose tap's data landed, or the\nParable that completed a Refresh. History and the Refresh menu say \"After\nOkta synced\" or \"After Shared Kinds refreshed\" from it.",
        "properties": {
          "completedAt": {
            "description": "The source's last completion the fire counted.",
            "format": "date-time",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableReportTriggerSourceKind"
          },
          "name": {
            "description": "The Provider connection's name, or the Parable's, as it is now. Empty\nwhen the source no longer exists in the Refresh's Workspace, and for a\nParable the reader may not see, which the app calls \"another Parable\".",
            "type": "string"
          },
          "sourceId": {
            "description": "TenantConnectorTap.id for PROVIDER_TAP, ProductParable.id for PARABLE.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "sourceId",
          "name",
          "completedAt"
        ],
        "type": "object"
      },
      "ParableReportVectorSibling": {
        "description": "A Lance vector sibling of a Report run's output table (EDR-0083). Nothing\nwrites this descriptor: since 2026-10-06 the output's Delta commit names its\nvector datasets instead. Deleted with ParableReportPlotOutput.vectorSiblings.",
        "properties": {
          "column": {
            "type": "string"
          },
          "datasetUri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "deltaVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "column",
          "datasetUri",
          "deltaVersion"
        ],
        "type": "object"
      },
      "ParableRerunEstimateInput": {
        "description": "What starting a change preview's estimate asks (PARABLE-5768).",
        "properties": {
          "retry": {
            "description": "Start again each changed Pipeline whose estimate failed, cancelled or\nstopped at its budget. Null or false starts only the runs not started\nyet and reads the rest as they stand.",
            "nullable": true,
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "ParableRerunEstimateNoteEnum": {
        "description": "What qualifies one changed Pipeline's estimate (PARABLE-5768).",
        "enum": [
          "published_policies",
          "reads_changed_rows"
        ],
        "type": "string"
      },
      "ParableRerunEstimateStatusEnum": {
        "description": "Where the change preview's estimate of the next Refresh's paid AI calls\nstands (PARABLE-5768).",
        "enum": [
          "not_needed",
          "unavailable",
          "pending",
          "done",
          "failed"
        ],
        "type": "string"
      },
      "ParableRerunPauseEnum": {
        "description": "The run cap a Refresh would pause at (PARABLE-4451): its paid AI calls, or\ntheir cost.",
        "enum": [
          "calls",
          "cost"
        ],
        "type": "string"
      },
      "ParableRerunPipelineEstimate": {
        "properties": {
          "estimatedCalls": {
            "description": "The calls its run is charged for the rows its inference log does not\nanswer, and their cost in US cents. Zero until DONE.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "estimatedCost": {
            "format": "double",
            "type": "number"
          },
          "failure": {
            "description": "Why the estimate failed, for FAILED.",
            "nullable": true,
            "type": "string"
          },
          "notes": {
            "description": "What qualifies the estimate, in enum order.",
            "items": {
              "$ref": "#/components/schemas/ParableRerunEstimateNoteEnum"
            },
            "type": "array"
          },
          "pausesAt": {
            "description": "The run cap its Refresh would pause at, or null when it fits both.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRerunPauseEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "status": {
            "$ref": "#/components/schemas/ParableRerunPipelineEstimateStatusEnum"
          },
          "unpricedCalls": {
            "description": "The estimatedCalls whose cost is unknown, which estimatedCost leaves out.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "status",
          "estimatedCalls",
          "estimatedCost",
          "unpricedCalls",
          "notes"
        ],
        "type": "object"
      },
      "ParableRerunPipelineEstimateStatusEnum": {
        "description": "Where one changed Pipeline's estimate stands (PARABLE-5768).",
        "enum": [
          "pending",
          "done",
          "failed",
          "not_estimated",
          "unavailable"
        ],
        "type": "string"
      },
      "ParableRerunPreview": {
        "properties": {
          "changed": {
            "description": "In Parable, then Plot order, each id compared by its bytes.",
            "items": {
              "$ref": "#/components/schemas/ParableRerunPreviewPipeline"
            },
            "type": "array"
          },
          "downstream": {
            "description": "In the order the Plot graph crate returns them: Parable, then Plot.",
            "items": {
              "$ref": "#/components/schemas/ParableRerunPreviewDownstream"
            },
            "type": "array"
          },
          "estimate": {
            "$ref": "#/components/schemas/ParableRerunPreviewEstimate"
          },
          "parableId": {
            "description": "The Parable whose Changes or shared settings change.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "threshold": {
            "$ref": "#/components/schemas/WorkspaceRefreshCostThreshold",
            "description": "The Workspace's Refresh cost threshold, which a predicted cost above is\ncalled out against (PARABLE-5758)."
          }
        },
        "required": [
          "parableId",
          "changed",
          "downstream",
          "estimate",
          "threshold"
        ],
        "type": "object"
      },
      "ParableRerunPreviewDownstream": {
        "description": "A Pipeline that reads one of the changed Pipelines' outputs, directly or\nthrough other Plots, in any Parable of the Workspace. Its run key moves\nonly when the rows it reads move.",
        "properties": {
          "afterSources": {
            "description": "Its Parable is another Parable with a Report plan that refreshes after\nits sources refresh, so it refreshes on its own once the changed\nPipelines' Parable completes a Refresh.",
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parableName": {
            "type": "string"
          },
          "plotKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "slug": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "parableId",
          "parableName",
          "plotKey",
          "name",
          "slug",
          "afterSources"
        ],
        "type": "object"
      },
      "ParableRerunPreviewEstimate": {
        "properties": {
          "estimatedCalls": {
            "description": "Sums over the changed Pipelines estimated so far (DONE): the paid AI\ncalls and their cost in US cents, and the calls whose cost is unknown.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "estimatedCost": {
            "format": "double",
            "type": "number"
          },
          "overThreshold": {
            "description": "estimatedCost is above the Workspace's Refresh cost threshold.",
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/ParableRerunEstimateStatusEnum"
          },
          "unpricedCalls": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "status",
          "estimatedCalls",
          "estimatedCost",
          "unpricedCalls",
          "overThreshold"
        ],
        "type": "object"
      },
      "ParableRerunPreviewPipeline": {
        "description": "What a publish of a set of Changes, or a change to a line's shared\nsettings, would run again on the next Refresh (PARABLE-5768). Which\nPipelines rerun is computed from web-db alone: the Plots the change leaves,\nthe published Versions of the Workspace's Parables and their PUBLISHED Plot\ndependency edges. Their paid AI calls come from ESTIMATE query runs\n(PARABLE-5757) under a draft capture of the change, which a POST starts\nand reads back: it returns at once, and the estimate fills in as the runs\ncomplete. A read of the list alone (GET) writes nothing.\nA Pipeline whose run key the change moves, so the next Refresh of its\nParable runs it instead of reusing its output.",
        "properties": {
          "estimate": {
            "$ref": "#/components/schemas/ParableRerunPipelineEstimate",
            "description": "The paid AI calls its next Refresh makes, from its ESTIMATE run."
          },
          "name": {
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parableName": {
            "type": "string"
          },
          "plotKey": {
            "description": "The Plot's entity key.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reasons": {
            "description": "Every reason that applies, in enum order.",
            "items": {
              "$ref": "#/components/schemas/ParableRerunReasonEnum"
            },
            "type": "array"
          },
          "schemaDiff": {
            "description": "The columns the publish adds, removes or retypes: the published Plot's\noutput schema against the one its Changes were planned with. Null when the\nPipeline's SQL does not change, or when either side has no planned schema.\nA new Pipeline is diffed against no schema, so every column is added.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableSchemaDiff"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "slug": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "parableId",
          "parableName",
          "plotKey",
          "name",
          "slug",
          "reasons",
          "estimate"
        ],
        "type": "object"
      },
      "ParableRerunReasonEnum": {
        "description": "Why a publish or a shared setting change would change a Pipeline's run key,\nso the next Refresh runs it again instead of reusing its output\n(PARABLE-5768).",
        "enum": [
          "sql",
          "policy",
          "setting",
          "input"
        ],
        "type": "string"
      },
      "ParableResolvedPaneValue": {
        "properties": {
          "binding": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePaneRuntimeBinding"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "fromPreference": {
            "description": "Only persisted JSON needs native hydration; frontend values stay native.",
            "type": "boolean"
          },
          "hasPrimitive": {
            "type": "boolean"
          },
          "policies": {
            "$ref": "#/components/schemas/ParableResolvedPolicies"
          },
          "primitive": {
            "description": "Any valid JSON value: object, array, primitive, or null",
            "nullable": true
          }
        },
        "required": [
          "hasPrimitive",
          "fromPreference",
          "policies"
        ],
        "type": "object"
      },
      "ParableResolvedPolicies": {
        "description": "Safe presentation of current decisions without disclosing policy settings'\nvalues. The authority key binds requester, Workspace, definition,\nmembership and policy/attachment revisions. It is an invalidation token,\nnot a capability credential; every subsequent operation rechecks current\nauthority. `admissions` holds one entry per action and part the reader may\ntake, saying which grant admitted them, and none for a denied one, so a\ngrant the reader fails is never described. `viewAs` is true under a View\nas preview, where grants admit by participation alone.",
        "properties": {
          "admissions": {
            "items": {
              "$ref": "#/components/schemas/ParablePolicyAdmission"
            },
            "maxItems": 24,
            "type": "array"
          },
          "authorityKey": {
            "type": "string"
          },
          "capabilities": {
            "$ref": "#/components/schemas/ParablePolicyCapabilities"
          },
          "revisions": {
            "items": {
              "$ref": "#/components/schemas/ParablePolicyAuthorityRevision"
            },
            "type": "array"
          },
          "seatCapabilities": {
            "description": "What this reader may do at the seat they hold, present only when the page\nworks in a participation mode below it (X-Parable-Participation) and\n`capabilities` were decided at that mode's seat; absent at the reader's own\nseat. A control `capabilities` withholds and this allows is one the reader\nturns on by switching to their fullest mode, so a Pane can say so instead of\nnaming who may. Presentation only; never write authority.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePolicyCapabilities"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "viewAs": {
            "type": "boolean"
          }
        },
        "required": [
          "capabilities",
          "authorityKey",
          "revisions",
          "admissions",
          "viewAs"
        ],
        "type": "object"
      },
      "ParableRevisionRef": {
        "description": "Exact Composed or Custom revision context.",
        "discriminator": {
          "mapping": {
            "composed_commit": "#/components/schemas/ComposedCommitRef",
            "composed_ref": "#/components/schemas/ComposedRefRevisionRef",
            "custom_registration": "#/components/schemas/CustomRegistrationRevisionRef"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ComposedRefRevisionRef"
          },
          {
            "$ref": "#/components/schemas/ComposedCommitRef"
          },
          {
            "$ref": "#/components/schemas/CustomRegistrationRevisionRef"
          }
        ]
      },
      "ParableRevisionRefKindEnum": {
        "enum": [
          "composed_ref",
          "composed_commit",
          "custom_registration"
        ],
        "type": "string"
      },
      "ParableRevisionSourceRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ParableSourceRefKindEnum"
          },
          "revision": {
            "$ref": "#/components/schemas/ParableRevisionRef"
          }
        },
        "required": [
          "kind",
          "revision"
        ],
        "type": "object"
      },
      "ParableRuntimePlotBinding": {
        "description": "One SQL computation the Pane owns: declared in its Perception, or derived from its kind.",
        "properties": {
          "contractHash": {
            "description": "Declaration hash captured before a saved or constructed invocation.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "derivedColumns": {
            "description": "The columns of each row when the Plot's rows come from its Pane's kind\n(PARABLE-5538): the kind picked to them, in the Plot's order. Null when\nthe Pane's Perception declares the Plot's contract.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "language": {
            "$ref": "#/components/schemas/ParablePieceLanguageEnum"
          },
          "plotKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "plotKey",
          "contractHash",
          "language"
        ],
        "type": "object"
      },
      "ParableSchemaDiff": {
        "description": "The top-level column diff of two Parable.Schema documents (PARABLE-1692),\nsuch as a Pipeline's published output schema and the one a publish would\ngive it. A column is retyped when its type, nullability or nested shape\ndiffers; a description, title, default, example or x-* annotation is not a\ntype. Computed only by parable-schema-diff (services/pkg/schema-diff-rs):\nquery-runner reaches it through parable-deltalake-rs, the Go services\nthrough parable-compose-ffi.",
        "properties": {
          "addedColumns": {
            "description": "Columns the new schema has and the old one does not, by name.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "classification": {
            "$ref": "#/components/schemas/ParableSchemaDiffClassificationEnum"
          },
          "removedColumns": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "retypedColumns": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "addedColumns",
          "removedColumns",
          "retypedColumns",
          "classification"
        ],
        "type": "object"
      },
      "ParableSchemaDiffClassificationEnum": {
        "description": "What a change to a Parable.Schema's top-level columns does to its readers\n(PARABLE-1692): a breaking change drops or retypes a column, an additive\none only adds columns, and a no-op changes none.",
        "enum": [
          "breaking",
          "additive",
          "no_op"
        ],
        "type": "string"
      },
      "ParableSourceLint": {
        "properties": {
          "diagnostics": {
            "description": "Empty unless the status is COMPLETE.",
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintDiagnostic"
            },
            "type": "array"
          },
          "error": {
            "description": "Why a FAILED block has no answer; null otherwise.",
            "nullable": true,
            "type": "string"
          },
          "revision": {
            "description": "`sha256:\u003chex\u003e` of the exact text the diagnostics describe. An agent compares\nit with the text it is about to edit before trusting any offset.",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ParableSourceLintStatusEnum"
          },
          "summary": {
            "$ref": "#/components/schemas/ParableSourceLintSummary"
          },
          "tools": {
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintTool"
            },
            "type": "array"
          }
        },
        "required": [
          "status",
          "revision",
          "tools",
          "summary",
          "diagnostics"
        ],
        "type": "object"
      },
      "ParableSourceLintDiagnostic": {
        "properties": {
          "docsUrl": {
            "nullable": true,
            "type": "string"
          },
          "excerpt": {
            "$ref": "#/components/schemas/ParableSourceLintExcerpt"
          },
          "fix": {
            "description": "Present only when a machine fix exists.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableSourceLintFix"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "help": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Stable for this revision, rule and location; a new revision mints new ids.",
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "offsets": {
            "$ref": "#/components/schemas/ParableSourceLintOffsets"
          },
          "origin": {
            "$ref": "#/components/schemas/ParableDiagnosticOriginEnum",
            "description": "The check that reported it. Defaults to LINT so lint results cached before\nthe field existed still read as lint."
          },
          "range": {
            "$ref": "#/components/schemas/ParableSourceLintRange"
          },
          "related": {
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintRelated"
            },
            "type": "array"
          },
          "rule": {
            "description": "The rule or code, e.g. `react-hooks(exhaustive-deps)`, `TS2322`, a Plot\ncode such as `PV_REF_004`, or an authoring code such as `PA-AU-035`.",
            "type": "string"
          },
          "severity": {
            "$ref": "#/components/schemas/ParableSourceLintSeverityEnum"
          },
          "source": {
            "description": "The tool that reported it: `oxlint`, `typescript`, `esbuild`,\n`plot-validator` for Plot SQL, or `parable` for a refused save.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "origin",
          "source",
          "rule",
          "severity",
          "message",
          "range",
          "offsets",
          "excerpt",
          "related"
        ],
        "type": "object"
      },
      "ParableSourceLintEdit": {
        "description": "One replacement in the offsets of the revision the diagnostic was computed on.",
        "properties": {
          "newText": {
            "type": "string"
          },
          "offsets": {
            "$ref": "#/components/schemas/ParableSourceLintOffsets"
          }
        },
        "required": [
          "offsets",
          "newText"
        ],
        "type": "object"
      },
      "ParableSourceLintExcerpt": {
        "description": "The exact flagged text and its whole line, for a find-and-replace edit.",
        "properties": {
          "line": {
            "type": "string"
          },
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text",
          "line"
        ],
        "type": "object"
      },
      "ParableSourceLintFix": {
        "description": "A machine fix; its edits are ready to apply to the linted revision.",
        "properties": {
          "edits": {
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintEdit"
            },
            "type": "array"
          },
          "safety": {
            "$ref": "#/components/schemas/ParableSourceLintFixSafetyEnum"
          }
        },
        "required": [
          "safety",
          "edits"
        ],
        "type": "object"
      },
      "ParableSourceLintFixSafetyEnum": {
        "description": "How far a lint fix may change what the code does, from oxlint's fix modes:\nSAFE (`--fix`) keeps behaviour and may be applied freely; SUGGESTION\n(`--fix-suggestions`) and DANGEROUS (`--fix-dangerously`) can change it and\nare read before they are applied. A Plot's reference completion is a\nSUGGESTION.",
        "enum": [
          "safe",
          "suggestion",
          "dangerous"
        ],
        "type": "string"
      },
      "ParableSourceLintOffsets": {
        "description": "A half-open [start, end) range of 0-based UTF-16 string indexes.",
        "properties": {
          "end": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "start": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "start",
          "end"
        ],
        "type": "object"
      },
      "ParableSourceLintPosition": {
        "description": "A 1-based line and column; the column counts UTF-16 code units.",
        "properties": {
          "column": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "line": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "line",
          "column"
        ],
        "type": "object"
      },
      "ParableSourceLintRange": {
        "properties": {
          "end": {
            "$ref": "#/components/schemas/ParableSourceLintPosition"
          },
          "start": {
            "$ref": "#/components/schemas/ParableSourceLintPosition"
          }
        },
        "required": [
          "start",
          "end"
        ],
        "type": "object"
      },
      "ParableSourceLintRelated": {
        "description": "A secondary location, e.g. the dependency array beside a hook's use of a value.",
        "properties": {
          "message": {
            "nullable": true,
            "type": "string"
          },
          "offsets": {
            "$ref": "#/components/schemas/ParableSourceLintOffsets"
          },
          "range": {
            "$ref": "#/components/schemas/ParableSourceLintRange"
          }
        },
        "required": [
          "range",
          "offsets"
        ],
        "type": "object"
      },
      "ParableSourceLintSeverityEnum": {
        "description": "How serious one Piece lint diagnostic is. oxlint's `advice` is INFO. The\neditor underlines each severity in its own colour; none blocks a save.",
        "enum": [
          "error",
          "warning",
          "info"
        ],
        "type": "string"
      },
      "ParableSourceLintStatusEnum": {
        "description": "Whether a Piece file's lint block is an answer. Only COMPLETE carries one:\na COMPLETE block with no diagnostics is a clean file; PENDING means linting\nhas not finished for this revision yet, and FAILED means it could not run\n(the block's `error` says why). Neither of those two is ever \"clean\".\nLower-case values: the Piece API returns them as-is to agents.",
        "enum": [
          "pending",
          "complete",
          "failed"
        ],
        "type": "string"
      },
      "ParableSourceLintSummary": {
        "properties": {
          "error": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "fixable": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "info": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "warning": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "error",
          "warning",
          "info",
          "fixable"
        ],
        "type": "object"
      },
      "ParableSourceLintTool": {
        "description": "Which tool and configuration produced a result; equal identities make it reusable.",
        "properties": {
          "configHash": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "version",
          "configHash"
        ],
        "type": "object"
      },
      "ParableSourceLintView": {
        "description": "One Piece source file's checks, keyed to its implementation row. Files in a\nlanguage nothing checks (YAML, JSON, CSS, plain code) have no entry.",
        "properties": {
          "build": {
            "description": "The compile of a Page's or Pane's source into the module the renderer\nruns, for the same text as `lint`: COMPLETE with every compile error and\nits position (empty when it built), or FAILED when the build could not\nrun. Null for a file that is not compiled on its own (a Plot, a Palette,\na Lab app's other files). Each Page and Pane is compiled alone, so one\nthat fails leaves the others rendering.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableSourceLint"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "implementationEntityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "language": {
            "$ref": "#/components/schemas/ParablePieceLanguageEnum"
          },
          "lint": {
            "$ref": "#/components/schemas/ParableSourceLint",
            "description": "oxlint and the TypeScript check for TSX, StyleX and TypeScript; the\nrecorded Plot SQL validation for Plot SQL. Runs in the background, so it\ncan be PENDING; the next read carries the answer."
          },
          "pieceKey": {
            "description": "The owning Piece's entityKey (the implementation's programKey).",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "implementationEntityKey",
          "pieceKey",
          "language",
          "lint"
        ],
        "type": "object"
      },
      "ParableSourceProject": {
        "additionalProperties": false,
        "description": "Additional files for a browser source implementation. The implementation's\ncode is the entry file; files contains the other files, keyed by relative\npath, with base64-encoded bytes so assets round-trip without text conversion.\nThe shared compiler resolves this graph without filesystem or network access.\nA Lab's stored project also keeps the package's Plot declarations, so export\nwrites each Plot's SQL back to its declared path. The SQL itself is not a\nfile here: it lives in the Plot's SQL implementation, and validateLabPackage\n(services/pkg/parable) refuses a tree where a declaration and its Plot\ndiffer.",
        "properties": {
          "entryPoint": {
            "type": "string"
          },
          "files": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "plots": {
            "description": "The Plots the package declares. A reader with a Peeking seat reads the\nLab's data only through these Plots. Null or empty declares none.",
            "items": {
              "$ref": "#/components/schemas/LabPlotDeclaration"
            },
            "nullable": true,
            "type": "array"
          },
          "runtimeVersion": {
            "description": "Host runtime contract, checked before compiling or executing a package.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "runtimeVersion",
          "entryPoint",
          "files"
        ],
        "type": "object"
      },
      "ParableSourceRef": {
        "description": "Typed source cited by a durable Problem message.",
        "discriminator": {
          "mapping": {
            "external": "#/components/schemas/ExternalSourceRef",
            "piece": "#/components/schemas/ParablePieceSourceRef",
            "revision": "#/components/schemas/ParableRevisionSourceRef"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ParableRevisionSourceRef"
          },
          {
            "$ref": "#/components/schemas/ParablePieceSourceRef"
          },
          {
            "$ref": "#/components/schemas/ExternalSourceRef"
          }
        ]
      },
      "ParableSourceRefKindEnum": {
        "enum": [
          "revision",
          "piece",
          "external"
        ],
        "type": "string"
      },
      "ParableVendor": {
        "description": "Vendor for API responses - includes computed fields.\nRepresents a top-level company/product family in the connector catalog.",
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "groupings": {
            "description": "Top-level groupings under this vendor",
            "items": {
              "$ref": "#/components/schemas/ParableVendorGrouping"
            },
            "type": "array"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "logo": {
            "description": "Logo metadata for display.",
            "nullable": true,
            "type": "object"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "sortOrder": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "slug",
          "name",
          "sortOrder",
          "groupings"
        ],
        "type": "object"
      },
      "ParableVendorGrouping": {
        "description": "Grouping for API responses - includes computed fields.\nRepresents a node in the connector hierarchy (can be organizational or a leaf connector).",
        "properties": {
          "breadcrumbs": {
            "description": "Full path for breadcrumbs (e.g., ['Atlassian', 'Jira', 'Jira Cloud'])",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "connectorId": {
            "description": "Reference to Connector entity for leaf groupings.\nNull for organizational groupings (folders).",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "connectorReleaseStatus": {
            "description": "Connector engineering lifecycle. Null for organizational groupings.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorLifecycleStatusEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "connectorSlug": {
            "description": "The connector's slug for leaf groupings. Plot SQL names the connector's\nProvider by it (providers.\u003cconnector\u003e.\u003ctable\u003e, after Parable.CatalogSlug's\nfold), so a Parable page opens this grouping's setup for a Provider its\nSQL names (PARABLE-5517). Null for organizational groupings (folders).",
            "maxLength": 32,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "docs": {
            "description": "Documentation content (Markdown).\nLoaded from docsPath if set.",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "externalVersion": {
            "nullable": true,
            "type": "string"
          },
          "groupingPath": {
            "description": "Slug path from vendor root to this grouping (e.g. 'jira/jira-cloud').\nUsed to build config URLs on the frontend. Null when not needed.",
            "nullable": true,
            "type": "string"
          },
          "groupings": {
            "description": "Child groupings",
            "items": {
              "$ref": "#/components/schemas/ParableVendorGrouping"
            },
            "type": "array"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ingestionConfigSchema": {
            "description": "If connector ID is set, then this value will be set to the ingestion\nconfig schema required for that connector",
            "nullable": true,
            "type": "object"
          },
          "integrationClass": {
            "description": "High-level integration class of the connector for leaf groupings\n(e.g. API pull vs STREAMING push). Null for organizational groupings.\nDrives the configuration flow variant in the frontend.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/IntegrationClassEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "isLeaf": {
            "description": "Whether this is a leaf node (can be configured).\nComputed: true if connectorId is set.",
            "type": "boolean"
          },
          "logo": {
            "description": "Logo for this grouping. Falls back to vendor logo when not set.",
            "nullable": true,
            "type": "object"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "parableVersion": {
            "nullable": true,
            "type": "string"
          },
          "parent": {
            "description": "Parent grouping (null if top-level under vendor)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableVendorGrouping"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "priority": {
            "description": "Priority assigned to this grouping for the current tenant, if any.\nSet by Parable admins via the admin API.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorPriorityEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "protocolType": {
            "description": "Push-protocol type of the connector for STREAMING leaf groupings\n(e.g. \"otlp\", \"webhook\"). Null for pull connectors and organizational\ngroupings. Drives protocol-specific endpoint setup instructions in the\nfrontend (e.g. OTLP exporter environment variables).",
            "nullable": true,
            "type": "string"
          },
          "releaseStage": {
            "$ref": "#/components/schemas/ParableReleaseStageEnum"
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "sortOrder": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "supportedAuthStrategies": {
            "description": "If connector ID is set, then this value will be set to the supported\nauth strategies required for that connector",
            "items": {
              "$ref": "#/components/schemas/ConnectorAuthStrategy"
            },
            "nullable": true,
            "type": "array"
          },
          "supportedInboundAuthStrategies": {
            "description": "If connector ID is set and the connector is a push (STREAMING) connector,\nthe inbound sender-verification strategies it supports. The tenant picks\none and supplies its configSchema credentials at setup.",
            "items": {
              "$ref": "#/components/schemas/InboundAuthStrategy"
            },
            "nullable": true,
            "type": "array"
          },
          "vendor": {
            "$ref": "#/components/schemas/ParableVendor",
            "description": "Vendor this belongs to"
          }
        },
        "required": [
          "id",
          "slug",
          "name",
          "releaseStage",
          "sortOrder",
          "vendor",
          "groupings",
          "isLeaf",
          "breadcrumbs"
        ],
        "type": "object"
      },
      "ParableVersionRef": {
        "description": "Published Parable revision context.",
        "discriminator": {
          "mapping": {
            "composed_commit": "#/components/schemas/ComposedCommitRef",
            "custom_registration": "#/components/schemas/CustomRegistrationRevisionRef"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ComposedCommitRef"
          },
          {
            "$ref": "#/components/schemas/CustomRegistrationRevisionRef"
          }
        ]
      },
      "ParableVersionSummaryView": {
        "description": "Both summary views are now sourced on ParableCommit: a published version IS\na commit carrying publishedSequence (PARABLE-1784). The two view classes are\nkept separate for now because they carry different field sets and are\nreferenced by different operations; collapsing them into one is a UI-facing\nchange and belongs with the Ponder work, not with this fold.",
        "properties": {
          "author": {
            "$ref": "#/components/schemas/ParableActorSnapshotView"
          },
          "contentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "latest": {
            "description": "Whether this is the newest published version on its line, for a \"Latest\"\nbadge. The server answers it by comparing this row's publishedSequence to\nthe highest one on the same Deployment, so a client needs no arithmetic and\nno assumption about the order rows arrive in.",
            "type": "boolean"
          },
          "publishedAt": {
            "description": "Was `sealedAt` on the published-version table.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "publishedSequence": {
            "description": "Was `versionNumber`. Nullable now, because an unpublished commit is a\nlegitimate row in this table; a summary is only ever built for a published\none.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "schemaEpoch": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "versionLocal": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "versionMajor": {
            "description": "The version number, as three integers the client formats and never computes\n(PARABLE-1469): `v{major}.{minor}` for a line that owns its numbers, and\n`v{major}.{minor}+{local}` for a line following an upstream, the `+{local}`\nsuffix shown only when local is above zero.\nThree fields and not one rendered string, because the commit row is\ndeliberately the integers and never the rendering -- the same rule the\ncommit's date label follows.\nNOT nullable, and that is the fix rather than a tidy-up (PARABLE-1469).\npsgen renders a nullable integer as a bare Go value plus `omitempty` -- not\na pointer, the way it renders a nullable string -- so `versionMinor: 0` was\ndeleted from the JSON before it left the server, the client's version label\nrequires a number, received undefined, and every row fell back to the\nauthor's name. v1.0 had never rendered anywhere. The same omission dropped\nthe explicit 0 on INSERT, which is why the column was mostly NULL.\nA version is only ever read off a PUBLISHED commit, and a published commit\nalways has all three. publishedSequence above stays nullable and remains the\nsole discriminator: it is what every read already filters on.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "versionMinor": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "versionMajor",
          "versionMinor",
          "versionLocal",
          "schemaEpoch",
          "latest",
          "author"
        ],
        "type": "object"
      },
      "ParableViewAsPerson": {
        "description": "One member of the Parable's Workspace you may preview as.",
        "properties": {
          "available": {
            "description": "False when they cannot be chosen: their seat is above yours, or they are invited.",
            "type": "boolean"
          },
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "invited": {
            "description": "True for a person invited to the Workspace who has not joined yet. They cannot be previewed until they join.",
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "raci": {
            "description": "Their seat on this Parable; null when they hold none. Shown as it will be when an invited person joins.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRaciRoleEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "userId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "userId",
          "name",
          "email",
          "available",
          "invited"
        ],
        "type": "object"
      },
      "ParableViewAsTargets": {
        "description": "The people a viewer may preview a Parable as.",
        "properties": {
          "people": {
            "description": "Active members of the Parable's Workspace matching the search, you excluded, at most 50, and the people invited to it who have not joined yet, at most 50 more.",
            "items": {
              "$ref": "#/components/schemas/ParableViewAsPerson"
            },
            "maxItems": 100,
            "type": "array"
          },
          "truncated": {
            "description": "True when more active members, or more invited people, matched than the list holds.",
            "type": "boolean"
          },
          "viewerRaci": {
            "$ref": "#/components/schemas/ParableRaciRoleEnum",
            "description": "Your own seat; people seated above it cannot be chosen."
          }
        },
        "required": [
          "viewerRaci",
          "people",
          "truncated"
        ],
        "type": "object"
      },
      "ParableViewAsView": {
        "description": "A started preview. Every read of the Parable carries its id.",
        "properties": {
          "expiresAt": {
            "description": "The preview stops answering after this instant; start it again to continue.",
            "format": "date-time",
            "type": "string"
          },
          "personEmail": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "personId": {
            "description": "The previewed person.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personName": {
            "type": "string"
          },
          "previewId": {
            "description": "Send as `X-Parable-View-As` on each read of this Parable; writes carrying it are refused.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "principal": {
            "$ref": "#/components/schemas/ParableContextActor",
            "description": "The execution principal Pane code and Plot SQL see: the previewed person."
          },
          "raci": {
            "description": "The participation every Policy is decided for. Null when the person holds no seat, so they cannot open the Parable.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRaciRoleEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "viewer": {
            "$ref": "#/components/schemas/ParableContextActor",
            "description": "You, as the Parable context's `viewAs` names you while the preview runs."
          },
          "viewerRaci": {
            "$ref": "#/components/schemas/ParableRaciRoleEnum",
            "description": "Your own seat, which bounds what the preview may show."
          }
        },
        "required": [
          "previewId",
          "rootRefId",
          "expiresAt",
          "personId",
          "personName",
          "personEmail",
          "principal",
          "viewerRaci",
          "viewer"
        ],
        "type": "object"
      },
      "ParableViewportSizeEnum": {
        "description": "The reference viewports a rendered preview can be framed at.\n\nLifts the union that lived in the design system's ViewportFrame.logic.ts onto\nthe wire, because a Piece can now AUTHOR its default size\n(ParablePage/Pane/Palette.defaultPreviewSize) and an authored value needs a\ntype both sides agree on. The pixel dimensions stay in the design system --\nthey are presentation, and a schema that pinned them would make resizing a\nbreakpoint a migration.\n\n\"No preview\" is deliberately absent. That is the ABSENCE of a size, which\nNullable already says; adding a NONE member would give it two spellings.",
        "enum": [
          "xs",
          "sm",
          "md",
          "lg",
          "xl"
        ],
        "type": "string"
      },
      "ParableWorkspaceTargetModeEnum": {
        "description": "Who a Rollout is addressed to (PARABLE-4083).\n\nALL and SOME are resolved when the Rollout is sent and stored as SOME, an\nexplicit list: ALL means every Workspace the sender may publish into at that\nmoment, so a Workspace created later receives nothing. PLATFORM_WIDE is the\nstaff audience: every Workspace on the platform, including ones created\nlater, which join at signup. Only an actor holding admin.parables.manage may\nsend it. A stored Rollout reads SOME or PLATFORM_WIDE; ALL is never stored.",
        "enum": [
          "all",
          "some",
          "platformWide"
        ],
        "type": "string"
      },
      "ParableWorkspaceTargetSelectionEnum": {
        "enum": [
          "required",
          "selected",
          "not_selected"
        ],
        "type": "string"
      },
      "ParentContextFieldMapping": {
        "description": "=============================================================================\nTap Definition Types\n=============================================================================\nMapping from a target field name to a source field name in the parent record.\nUsed to inject parent record values into child records during tap execution.",
        "properties": {
          "sourceField": {
            "description": "Field name to read from parent record",
            "type": "string"
          },
          "targetField": {
            "description": "Field name to set in child records",
            "type": "string"
          }
        },
        "required": [
          "targetField",
          "sourceField"
        ],
        "type": "object"
      },
      "ParentDataFilterBodyInject": {
        "additionalProperties": false,
        "description": "When set on RestEndpointConfig, the tap (typically a root tap) injects\ningestionConfig.parentDataFilters[filterKey].values into requestBody at\nbodyPath. No parent-tap fan-out or frontier is required.",
        "properties": {
          "bodyPath": {
            "description": "Top-level requestBody key that receives the values array.\nExample: 'userPrincipalNameFilters' for Microsoft Purview audit queries.",
            "type": "string"
          },
          "field": {
            "description": "Expected parentDataFilters[filterKey].field. Values are injected as-is\nwhen the field matches; field mismatch or empty values skip the tap\n(fail closed). When the filter key is absent, the body key is omitted\n(tenant-wide).",
            "type": "string"
          },
          "filterKey": {
            "description": "Key under ingestionConfig.parentDataFilters (e.g. 'users').",
            "type": "string"
          }
        },
        "required": [
          "filterKey",
          "bodyPath",
          "field"
        ],
        "type": "object"
      },
      "ParentDataFilterCombineOperatorEnum": {
        "description": "How parentDataFilterQueryInject combines joined clauses with an existing\nquery param value (typically a time-window $filter).",
        "enum": [
          "and",
          "or"
        ],
        "type": "string"
      },
      "ParentDataFilterJoinOperatorEnum": {
        "description": "How parentDataFilterQueryInject joins multiple per-value clauses.",
        "enum": [
          "or",
          "and"
        ],
        "type": "string"
      },
      "ParentDataFilterNormalizeEnum": {
        "description": "Optional value normalization before parentDataFilterQueryInject renders\nclauseTemplate. Unrecognized values must fail at schema validation time\n(not silently no-op at runtime).",
        "enum": [
          "lowercase"
        ],
        "type": "string"
      },
      "ParentDataFilterQueryInject": {
        "additionalProperties": false,
        "description": "When set on RestEndpointConfig, the tap injects\ningestionConfig.parentDataFilters[filterKey].values into a query parameter.\nTwo modes:\n1) OData expression (Microsoft): set clauseTemplate + join/combine operators\nto build a $filter string.\n2) Repeated list values (Claude Compliance actor_ids[]): omit clauseTemplate;\nvalues are passed as a list on queryParam (doseq-encoded).",
        "properties": {
          "chunkSize": {
            "description": "Max values per request. Null uses the runtime default (10 for OData\nmode, 50 for repeated-list mode). Both defaults keep the encoded query\nstring under the common 8KB request-line cap.",
            "format": "double",
            "maximum": 500,
            "minimum": 1,
            "nullable": true,
            "type": "number"
          },
          "clauseTemplate": {
            "description": "Per-value clause with '{value}' placeholder for OData expression mode.\nExample: \"userPrincipalName eq '{value}'\".\nNull selects repeated-list mode (values set as a list on queryParam).",
            "nullable": true,
            "pattern": "\\{value\\}",
            "type": "string"
          },
          "combineOperator": {
            "description": "How to combine the joined clauses with an existing queryParam value\n(OData mode only). When the query param is absent, only the joined\nclauses are used.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParentDataFilterCombineOperatorEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "field": {
            "description": "Expected parentDataFilters[filterKey].field. Values are injected when the\nfield matches; field mismatch or empty values skip the tap (fail closed).\nWhen the filter key is absent, no inject runs (tenant-wide).",
            "type": "string"
          },
          "filterKey": {
            "description": "Key under ingestionConfig.parentDataFilters (e.g. 'users').",
            "type": "string"
          },
          "joinOperator": {
            "description": "How to join multiple value clauses (OData mode only).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParentDataFilterJoinOperatorEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "normalize": {
            "description": "Optional value normalization before render / inject.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParentDataFilterNormalizeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "queryParam": {
            "description": "Query parameter name that receives the filter.\nExamples: '$filter' (OData), 'actor_ids[]' (repeated list).",
            "type": "string"
          }
        },
        "required": [
          "filterKey",
          "field",
          "queryParam"
        ],
        "type": "object"
      },
      "ParentEligibilityPredicate": {
        "description": "One condition a parent record must satisfy to be fanned out to a child tap.\n\nA predicate must only encode deterministic expected absence -- a parent the\nvendor is already known to have no child rows for. It must never encode\ntransient errors, access failures, or merely slow parents; those are\nretryable and filtering them silently loses data.\n\nOperators (validated at frontier planning time, not by the schema, because\ngenerated enum fields are not parseable from runtime dicts):\nany_of      field value matches one of `values` (case-insensitive)\nnone_of     field value matches none of `values` (case-insensitive)\nexists      field is present and neither null nor empty\nnot_exists  field is absent, null, or empty\ngt gte lt lte           numeric field compared against `threshold`\nlength_gt length_gte    length of a list or string compared against `threshold`",
        "properties": {
          "field": {
            "description": "Parent record field to evaluate. Dotted path for nested fields.",
            "maxLength": 255,
            "type": "string"
          },
          "operator": {
            "description": "Comparison to apply to the field value. One of the operators above.",
            "maxLength": 32,
            "type": "string"
          },
          "threshold": {
            "description": "Operand for the numeric and length operators. Unused by every other operator.",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "values": {
            "description": "Operand for `any_of` and `none_of`. Unused by every other operator.",
            "items": {
              "maxLength": 255,
              "type": "string"
            },
            "maxItems": 10000,
            "minItems": 1,
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "field",
          "operator"
        ],
        "type": "object"
      },
      "ParentEligibilityPredicateInput": {
        "description": "One condition a parent record must satisfy to be fanned out to a child tap.\n\nA predicate must only encode deterministic expected absence -- a parent the\nvendor is already known to have no child rows for. It must never encode\ntransient errors, access failures, or merely slow parents; those are\nretryable and filtering them silently loses data.\n\nSee ParentEligibilityPredicate for the operator vocabulary.",
        "properties": {
          "field": {
            "description": "Parent record field to evaluate. Dotted path for nested fields.",
            "maxLength": 255,
            "type": "string"
          },
          "operator": {
            "description": "Comparison to apply to the field value.",
            "maxLength": 32,
            "type": "string"
          },
          "threshold": {
            "description": "Operand for the numeric and length operators. Unused by every other operator.",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "values": {
            "description": "Operand for `any_of` and `none_of`. Unused by every other operator.",
            "items": {
              "maxLength": 255,
              "type": "string"
            },
            "maxItems": 10000,
            "minItems": 1,
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "field",
          "operator"
        ],
        "type": "object"
      },
      "PathParamEncodingEnum": {
        "description": "Provider-neutral transformations for values inserted into endpoint paths.",
        "enum": [
          "double_url_encode_slashes"
        ],
        "type": "string"
      },
      "PathParamEncodingRule": {
        "additionalProperties": false,
        "description": "One transformation applied to a named endpoint-template parameter.",
        "properties": {
          "encoding": {
            "$ref": "#/components/schemas/PathParamEncodingEnum"
          },
          "parameter": {
            "type": "string"
          }
        },
        "required": [
          "parameter",
          "encoding"
        ],
        "type": "object"
      },
      "PendingMilestoneDelegation": {
        "description": "Populated when a delegation request has been sent for this milestone but the data has not yet been connected.\nNull when no pending request exists or the milestone is already enabled.",
        "properties": {
          "recipients": {
            "description": "Email addresses the request was sent to",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "requestedAt": {
            "description": "When the most recent request was sent",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "requestedAt",
          "recipients"
        ],
        "type": "object"
      },
      "PeopleProof": {
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemProofKindEnum"
          },
          "name": {
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reviewerRefs": {
            "items": {
              "$ref": "#/components/schemas/ParableActorRef"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "kind",
          "problemId",
          "reviewerRefs"
        ],
        "type": "object"
      },
      "PersonPet": {
        "description": "One person-owned adoption of a Pet archetype.",
        "properties": {
          "adoptedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "currentAssetRevision": {
            "$ref": "#/components/schemas/PetAssetRevision"
          },
          "displayName": {
            "description": "Derived by the server, for example \"Patrice the Parable Pickle\".",
            "type": "string"
          },
          "displayOrder": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "givenName": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pet": {
            "$ref": "#/components/schemas/Pet"
          },
          "positionXPermille": {
            "description": "Horizontal center in thousandths of the active content view.",
            "format": "int64",
            "maximum": 1000,
            "minimum": 0,
            "type": "integer"
          },
          "positionYPermille": {
            "description": "Vertical anchor in thousandths of the active content view.",
            "format": "int64",
            "maximum": 1000,
            "minimum": 0,
            "type": "integer"
          },
          "revision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "selectedStyleVariantId": {
            "description": "Always persisted, including when this Pet has exactly one selectable style.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceAssetRevision": {
            "$ref": "#/components/schemas/PetAssetRevision"
          },
          "state": {
            "$ref": "#/components/schemas/PersonPetStateEnum"
          }
        },
        "required": [
          "id",
          "pet",
          "displayName",
          "state",
          "positionXPermille",
          "positionYPermille",
          "displayOrder",
          "adoptedAt",
          "revision",
          "selectedStyleVariantId",
          "sourceAssetRevision",
          "currentAssetRevision"
        ],
        "type": "object"
      },
      "PersonPetPageView": {
        "description": "Every Pet adopted by the current person: on screen, pocketed, and inactive under Potential Pets.",
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PersonPet"
            },
            "type": "array"
          },
          "maxOnScreenPets": {
            "description": "Person-specific limit for simultaneously on-screen Pets.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "maxOnScreenPets"
        ],
        "type": "object"
      },
      "PersonPetStateEnum": {
        "description": "Where an adopted Pet currently lives: on screen, pocketed, or inactive under Potential Pets.",
        "enum": [
          "on_screen",
          "in_pen",
          "abandoned"
        ],
        "type": "string"
      },
      "PersonaInteractionSnapshotKindEnum": {
        "description": "Historical Run snapshots retain the pre-profile interaction kinds.",
        "enum": [
          "dictation",
          "voice",
          "image",
          "video",
          "audio",
          "stock_image",
          "stock_video",
          "stock_audio"
        ],
        "type": "string"
      },
      "PersonaPersonalitySlotEnum": {
        "description": "Historical: the profile a Persona-era Run asked for. Runs started before\nPARABLE-6164 hold it in their requested Persona selection.",
        "enum": [
          "simple",
          "standard",
          "strong"
        ],
        "type": "string"
      },
      "PersonaPersonalitySnapshotSlotEnum": {
        "description": "Historical: Run snapshots stay readable across the Set/Speed/interaction cutovers and the Persona deletion (PARABLE-6164).",
        "enum": [
          "set",
          "search",
          "simple",
          "standard",
          "strong",
          "speed",
          "media",
          "voice",
          "speak"
        ],
        "type": "string"
      },
      "PersonaResolutionSourceEnum": {
        "enum": [
          "explicit",
          "last_selected",
          "first_eligible",
          "legacy_default"
        ],
        "type": "string"
      },
      "Pet": {
        "description": "A shared Pet catalog archetype such as \"Parable Pickle\".\nOwnership and nicknames live on PersonPet. An optional Early Access Release\ngates rollout by Workspace data instead of a hard-coded Workspace, role\nname, or environment-specific identifier.",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "catalogAudience": {
            "$ref": "#/components/schemas/PetCatalogAudienceEnum"
          },
          "catalogKey": {
            "type": "string"
          },
          "catalogRank": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "currentAssetRevision": {
            "$ref": "#/components/schemas/PetAssetRevision"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "pendingPet": {
            "description": "Whether this archetype is pending catalog artwork review.",
            "type": "boolean"
          },
          "requiredEarlyAccessReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "spriteVersionNumber": {
            "description": "Runtime projection of currentAssetRevision.spriteVersionNumber.",
            "format": "int64",
            "maximum": 2,
            "minimum": 1,
            "type": "integer"
          },
          "styleVariants": {
            "description": "Selectable styles. The preview revision above never implies a default selection.",
            "items": {
              "$ref": "#/components/schemas/PetStyleVariant"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "catalogKey",
          "catalogAudience",
          "currentAssetRevision",
          "spriteVersionNumber",
          "styleVariants",
          "catalogRank",
          "active",
          "pendingPet"
        ],
        "type": "object"
      },
      "PetAnimation": {
        "description": "One named animation track within a Pet spritesheet.",
        "properties": {
          "fallback": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "fps": {
            "format": "double",
            "maximum": 60,
            "minimum": 0.1,
            "nullable": true,
            "type": "number"
          },
          "frameDurationsMs": {
            "description": "Exact v2 per-frame timing. Null lets a legacy asset fall back to fps.",
            "items": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "maximum": 9007199254740991,
              "minimum": 1,
              "type": "integer"
            },
            "maxItems": 256,
            "minItems": 1,
            "nullable": true,
            "type": "array"
          },
          "frames": {
            "items": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "maximum": 9007199254740991,
              "minimum": 0,
              "type": "integer"
            },
            "maxItems": 256,
            "minItems": 1,
            "type": "array"
          },
          "loop": {
            "type": "boolean"
          }
        },
        "required": [
          "frames",
          "loop",
          "fallback"
        ],
        "type": "object"
      },
      "PetAssetProvenance": {
        "description": "Reproducible authoring and import facts for one immutable asset revision.",
        "properties": {
          "authoringSkillHandle": {
            "description": "Canonical Agent Skill name, for example `structure-design-parable-pets`.",
            "maxLength": 255,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "authoringSkillVersion": {
            "nullable": true,
            "type": "string"
          },
          "generator": {
            "nullable": true,
            "type": "string"
          },
          "generatorVersion": {
            "nullable": true,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PetAssetProvenanceKindEnum"
          },
          "license": {
            "nullable": true,
            "type": "string"
          },
          "qualityAttestation": {
            "description": "Null for legacy imports; required and server-verified for custom v2 art.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PetAssetQualityAttestation"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "PetAssetProvenanceKindEnum": {
        "description": "How an immutable Pet asset revision entered the catalog or a person's lineage.",
        "enum": [
          "imported",
          "authored",
          "customized"
        ],
        "type": "string"
      },
      "PetAssetQualityAttestation": {
        "description": "Immutable evidence for one completed upstream v2 authoring run.",
        "properties": {
          "atlasContentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "atlasValidationContentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "contentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "contractVersion": {
            "description": "Version of the Pet asset contract, currently v2 only.",
            "format": "int64",
            "maximum": 2,
            "minimum": 2,
            "type": "integer"
          },
          "requestContentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "runSummaryContentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "uri": {
            "description": "Canonical server-managed JSON attestation, verified before persistence.",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          }
        },
        "required": [
          "contractVersion",
          "atlasContentHash",
          "requestContentHash",
          "runSummaryContentHash",
          "atlasValidationContentHash",
          "uri",
          "contentHash"
        ],
        "type": "object"
      },
      "PetAssetRevision": {
        "description": "One immutable Pet asset revision.\nVersion 1 is the original nine-row animation contract. Version 2 is the\neleven-row contract with directional look tracks. The content hash is the\nasset identity; the URI is only a retrieval location.",
        "properties": {
          "animations": {
            "additionalProperties": {
              "$ref": "#/components/schemas/PetAnimation"
            },
            "type": "object"
          },
          "contentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "customizationPrompt": {
            "description": "Markdown text",
            "maxLength": 8192,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lookFrames": {
            "items": {
              "$ref": "#/components/schemas/PetLookFrame"
            },
            "type": "array"
          },
          "parentRevisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personPetId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "petId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "playback": {
            "$ref": "#/components/schemas/PetPlaybackPolicy"
          },
          "provenance": {
            "$ref": "#/components/schemas/PetAssetProvenance"
          },
          "revisionNumber": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "sourceUri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "spriteSheet": {
            "$ref": "#/components/schemas/PetSpriteSheet"
          },
          "spriteVersionNumber": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 2,
            "minimum": 1,
            "type": "integer"
          },
          "styleId": {
            "description": "Concrete style used to author these immutable spritesheet bytes.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "petId",
          "revisionNumber",
          "styleId",
          "spriteVersionNumber",
          "spriteSheet",
          "animations",
          "lookFrames",
          "playback",
          "sourceUri",
          "contentHash",
          "provenance",
          "createdAt"
        ],
        "type": "object"
      },
      "PetCatalogAudienceEnum": {
        "description": "Who may discover and adopt a Pet catalog archetype.",
        "enum": [
          "workspace",
          "admin"
        ],
        "type": "string"
      },
      "PetCatalogView": {
        "description": "Searchable Pet archetypes eligible for the current person and Workspace context.",
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/Pet"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "PetEggsView": {
        "description": "The current person's Pet-egg balance. Everyone holds one egg before any egg mutation.",
        "properties": {
          "eggs": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "unseen": {
            "description": "True when an egg was awarded since the person last opened Pets.",
            "type": "boolean"
          }
        },
        "required": [
          "eggs",
          "unseen"
        ],
        "type": "object"
      },
      "PetLookFrame": {
        "description": "One directional-look frame from the two v2 angle rows.",
        "properties": {
          "angleDegrees": {
            "format": "double",
            "maximum": 359.999,
            "minimum": 0,
            "type": "number"
          },
          "frame": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "angleDegrees",
          "frame"
        ],
        "type": "object"
      },
      "PetPlaybackPolicy": {
        "description": "Runtime playback behavior carried with an asset instead of inferred by vendor.",
        "properties": {
          "actionRepeatCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "idleTailDurationMultiplier": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "reducedMotionFirstFrameOnly": {
            "type": "boolean"
          }
        },
        "required": [
          "actionRepeatCount",
          "idleTailDurationMultiplier",
          "reducedMotionFirstFrameOnly"
        ],
        "type": "object"
      },
      "PetSpriteSheet": {
        "description": "Frame grid for one transparent Pet spritesheet.",
        "properties": {
          "columns": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 64,
            "minimum": 1,
            "type": "integer"
          },
          "frameHeight": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 4096,
            "minimum": 1,
            "type": "integer"
          },
          "frameWidth": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 4096,
            "minimum": 1,
            "type": "integer"
          },
          "rows": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 64,
            "minimum": 1,
            "type": "integer"
          },
          "uri": {
            "description": "Browser-resolvable local path or absolute asset URI.",
            "maxLength": 4096,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "uri",
          "frameWidth",
          "frameHeight",
          "columns",
          "rows"
        ],
        "type": "object"
      },
      "PetStyle": {
        "description": "One Parable-owned visual style available for Pet authoring and selection.",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "catalogRank": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "styleKey": {
            "description": "Stable authoring and catalog key, such as `plush` or `flat-vector`.",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "styleKey",
          "catalogRank",
          "active"
        ],
        "type": "object"
      },
      "PetStyleVariant": {
        "description": "One selectable style for a catalog Pet and the current revision for that style.",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "catalogRank": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "currentAssetRevision": {
            "$ref": "#/components/schemas/PetAssetRevision"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "petId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "style": {
            "$ref": "#/components/schemas/PetStyle"
          }
        },
        "required": [
          "id",
          "petId",
          "style",
          "currentAssetRevision",
          "catalogRank",
          "active"
        ],
        "type": "object"
      },
      "PictureProof": {
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemProofKindEnum"
          },
          "name": {
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "screenshots": {
            "items": {
              "description": "Image metadata",
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "kind",
          "problemId",
          "screenshots"
        ],
        "type": "object"
      },
      "PlanLabPackageEditInput": {
        "description": "An edit to a Lab package (PARABLE-7230): the text files it sets or deletes,\nand the Plot declarations of parable.lab.json. Null `plots` keeps the\ncurrent declarations. A list replaces them, and an empty list removes them\nall. The Lab package planner plans the Lab's current files with these edits\napplied. It is the same planner that a ZIP import runs, with the same\nper-file and total limits. The operation's body limit bounds one edit.",
        "properties": {
          "files": {
            "items": {
              "$ref": "#/components/schemas/LabPackageFileEditInput"
            },
            "minItems": 0,
            "type": "array"
          },
          "plots": {
            "items": {
              "$ref": "#/components/schemas/LabPlotDeclaration"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "files"
        ],
        "type": "object"
      },
      "PlanParableProblemMentionInput": {
        "properties": {
          "actorRef": {
            "$ref": "#/components/schemas/ParableActorRef"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "actorRef",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "PlanSqlResult": {
        "description": "What planning a statement produced. Exactly one of the two holds: `planned`\nis true and `columns` are the columns it would return, or `planned` is\nfalse and `refusal` says why.",
        "properties": {
          "columns": {
            "items": {
              "$ref": "#/components/schemas/QueryResultColumn"
            },
            "type": "array"
          },
          "elapsedMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "planned": {
            "type": "boolean"
          },
          "refusal": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/QueryRefusal"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "requestId": {
            "type": "string"
          }
        },
        "required": [
          "planned",
          "columns",
          "elapsedMs",
          "requestId"
        ],
        "type": "object"
      },
      "PlanWorkspaceParableArchiveImportInput": {
        "properties": {
          "file": {
            "description": "Artifact file metadata with GCS storage path",
            "type": "object"
          }
        },
        "required": [
          "file"
        ],
        "type": "object"
      },
      "PlotContractReceipt": {
        "description": "Derived compiler receipt attached to an owned Plot; not an authored catalog.",
        "properties": {
          "contractHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "inputHydration": {
            "type": "string"
          },
          "inputValidation": {
            "description": "Exact UTF-8 JSON text, in the same digest order as execution requests.",
            "type": "string"
          },
          "outputHydration": {
            "type": "string"
          },
          "outputValidation": {
            "type": "string"
          }
        },
        "required": [
          "contractHash",
          "inputValidation",
          "outputValidation",
          "inputHydration",
          "outputHydration"
        ],
        "type": "object"
      },
      "PlotDataColumn": {
        "description": "One ordered response column.",
        "properties": {
          "name": {
            "type": "string"
          },
          "primitive": {
            "description": "Scalar primitive kind from scalar-lib metadata (e.g. String, Int), validated by the scalar (PARABLE-3279).",
            "maxLength": 16,
            "minLength": 3,
            "pattern": "^(String|Int|Float|Bool|Type)$",
            "type": "string"
          },
          "scalarRef": {
            "description": "Canonical name of a Parable scalar (e.g., Identity.UUID, Generic.Int64)",
            "maxLength": 128,
            "minLength": 3,
            "nullable": true,
            "pattern": "^[A-Z][A-Za-z0-9]*\\.[A-Z][A-Za-z0-9]*$",
            "type": "string"
          }
        },
        "required": [
          "name",
          "primitive"
        ],
        "type": "object"
      },
      "PlotDataCommand": {
        "properties": {
          "columns": {
            "description": "Optional projected columns; null means all schema columns.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "cursor": {
            "description": "Opaque pagination cursor minted by the server; null starts at the first page.\nIts encoding is private to query-layer (PARABLE-2701) and is not a schema.",
            "nullable": true,
            "type": "string"
          },
          "expectedContractHash": {
            "description": "Contract captured by the renderer; stale declarations refuse before execution.",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "expectedRefRevision": {
            "description": "Draft revision captured by the React host; prevents silent definition drift.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "pageSize": {
            "description": "Page size. The max here is the wire guard and must equal\nQueryLayerConfig.PLOT_DATA_PAGE_SIZE_MAX, which the server enforces with\nPD-PAGE-001. Both are generated; the artifact test pins them equal.\nInt64, not number: bare number generates f64 / float64.",
            "format": "int64",
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "paneValues": {
            "description": "The reader's on-screen values of the Panes the Plot reads by name. A\nPane left out reads its saved value: Me, then This Parable, then the\nPlot's default. At most 1 MB in all.",
            "items": {
              "$ref": "#/components/schemas/PlotReadPaneValue"
            },
            "nullable": true,
            "type": "array"
          },
          "parameters": {
            "description": "Omitted uses saved bindings; a supplied array replaces all bindings.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "nullable": true,
            "type": "array"
          },
          "plot": {
            "description": "Plot slug within the Parable (immutable SQL segment).",
            "maxLength": 255,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "plotKey": {
            "description": "Stable declared Plot identity; alternative to the catalog slug.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reading": {
            "$ref": "#/components/schemas/PlotDataReading"
          },
          "requireMaterialized": {
            "description": "Read a compatible completed artifact only; never execute ordinary SQL.",
            "nullable": true,
            "type": "boolean"
          },
          "sort": {
            "description": "Ordered sort terms; null means server default order.",
            "items": {
              "$ref": "#/components/schemas/PlotDataSortTerm"
            },
            "nullable": true,
            "type": "array"
          },
          "sql": {
            "description": "Constructed SQL for the selected declared contract, run in place of the saved source. Accepted only from someone who could save it as this Plot: tenant.parables.manage (staff: admin.parables.manage), Publishing or Primary on the Parable, and edit.plots or create.plots from the Plot's Pane Policies.",
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "reading",
          "pageSize"
        ],
        "type": "object"
      },
      "PlotDataManifest": {
        "description": "Per-Parable data contract served to the runtime / editor.\nNo storage URI, Delta version, SQL string, or table path.",
        "properties": {
          "contractVersion": {
            "type": "string"
          },
          "parable": {
            "$ref": "#/components/schemas/PlotDataManifestParable"
          },
          "plots": {
            "items": {
              "$ref": "#/components/schemas/PlotDataManifestEntry"
            },
            "type": "array"
          },
          "ref": {
            "description": "Authoring or published ref this manifest was built for.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "contractVersion",
          "parable",
          "ref",
          "plots"
        ],
        "type": "object"
      },
      "PlotDataManifestColumn": {
        "description": "Manifest column with sortability projected from scalar-lib is_sortable.",
        "properties": {
          "name": {
            "type": "string"
          },
          "primitive": {
            "description": "A bare string, and NOT Parable.Primitive like its two siblings\n(ParablePoolField.primitive, PlotDataColumn.primitive). Checked against the\nproducer rather than assumed: primitiveFallback in\nutils/psgen/internal/generator/parableplotsdatagen/generate.go emits\n`Boolean` for a bool column, `Unknown` for an empty type name, and passes an\nunrecognized type name through verbatim. None of those three are\nPrimitiveKind dsl_names, so this field carries a WIDER vocabulary than the\nclosed five and the scalar would reject values the manifest legitimately\nserves today. Narrowing it means deciding what the manifest says for an\nunresolvable column, which is PARABLE-2708's call, not this field's\n(PARABLE-3279, follow-up PARABLE-3574).",
            "type": "string"
          },
          "scalarRef": {
            "description": "Canonical name of a Parable scalar (e.g., Identity.UUID, Generic.Int64)",
            "maxLength": 128,
            "minLength": 3,
            "nullable": true,
            "pattern": "^[A-Z][A-Za-z0-9]*\\.[A-Z][A-Za-z0-9]*$",
            "type": "string"
          },
          "sortable": {
            "description": "Computed by the generator from ScalarMetadata.is_sortable, not a local allowlist.",
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "primitive",
          "sortable"
        ],
        "type": "object"
      },
      "PlotDataManifestEntry": {
        "description": "Invariant, enforced by the manifest generator (PARABLE-2708) because psgen has\nno discriminated types: UNAVAILABLE entries carry a non-null unavailableReason\nand empty columns; AVAILABLE entries carry a null reason and the schema columns.",
        "properties": {
          "columns": {
            "description": "Empty when UNAVAILABLE.",
            "items": {
              "$ref": "#/components/schemas/PlotDataManifestColumn"
            },
            "type": "array"
          },
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "outputSchemaUpdatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "requiresReportingRun": {
            "type": "boolean"
          },
          "schemaStatus": {
            "$ref": "#/components/schemas/PlotDataSchemaStatus"
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "unavailableReason": {
            "description": "Non-null when schemaStatus is UNAVAILABLE.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "slug",
          "handle",
          "entityKey",
          "schemaStatus",
          "columns",
          "requiresReportingRun"
        ],
        "type": "object"
      },
      "PlotDataManifestParable": {
        "properties": {
          "entityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "entityKey"
        ],
        "type": "object"
      },
      "PlotDataMeta": {
        "description": "Resolved result metadata. Field names align with parable-reporting views:\npublishedCommitId, occurredAt, plotEntityVersion.",
        "properties": {
          "consumerContractHash": {
            "description": "Selected consumer contract that admitted these captured or current values.",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "context": {
            "description": "Trusted execution snapshot captured before reading data.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableContext"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "contractHash": {
            "description": "Contract and source that actually produced this response.",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "currentDirectoryData": {
            "description": "A directory could not be read as of the selected Refresh. Its current rows\nare returned and the platform displays that distinction beside the Pane.",
            "nullable": true,
            "type": "boolean"
          },
          "freshness": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "inputHydration": {
            "description": "Native representation metadata; excludes private validator literals and source.",
            "nullable": true
          },
          "materialized": {
            "description": "True only when these rows were read from the selected completed artifact.",
            "type": "boolean"
          },
          "occurredAt": {
            "description": "Run occurredAt for REPORT_RUN; null for CURRENT.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "outputHydration": {
            "description": "Any valid JSON value: object, array, primitive, or null",
            "nullable": true
          },
          "parableReads": {
            "description": "The Platform Parables this read read through Plots of other Parables,\neach with the Release and Refresh read (PARABLE-6986). Null or empty when\nit read none.",
            "items": {
              "$ref": "#/components/schemas/PlotDataParableRead"
            },
            "nullable": true,
            "type": "array"
          },
          "plotEntityVersion": {
            "description": "Sealed Plot version for REPORT_RUN; null for CURRENT.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "plotKey": {
            "description": "Stable logical Plot identity across definition versions.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "publishedCommitId": {
            "description": "Published commit the read resolved to; mirrors ParableReportRunView.publishedCommitId\nand is never a version string. Null only for CURRENT against a draft proposal ref\n(design mode), which has no published commit. REPORT_RUN always fills it.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reading": {
            "$ref": "#/components/schemas/PlotDataReading",
            "description": "Resolved reading (reportRunId filled for REPORT_RUN)."
          },
          "sample": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlotDataSampleMeta"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "sampled": {
            "description": "Kept as an explicit wire flag per the spec. The server guarantees\nsampled == (sample != null); psgen cannot couple the two fields.",
            "type": "boolean"
          },
          "sourceHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "sourceImplementationId": {
            "description": "Producer implementation row and version; a Report may have been produced by an older definition.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceImplementationVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "tableCardinality": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "watermark": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "materialized",
          "reading",
          "sampled",
          "freshness"
        ],
        "type": "object"
      },
      "PlotDataParableRead": {
        "description": "One Platform Parable a read read through another Parable's Plots\n(PARABLE-6986).",
        "properties": {
          "empty": {
            "description": "True when its Plots read as empty tables: it is not Visible in the\nWorkspace, or it completed no Refresh by the AS OF time of the reading\nParable's Refresh.",
            "type": "boolean"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "releaseId": {
            "description": "The Platform Parable's Release that made the rows read: for a view, the\nRelease the read reads; for a stored Plot, the Release whose Refresh made\nthe output. A stored Plot is read by its columns, so that can be another\nRelease with the same columns, and one Parable can be listed once for\neach Release.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reportRunId": {
            "description": "The Refresh of it whose stored output was read. Null when the read read\nnone of its stored Plots, or read them empty.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "parableId",
          "releaseId",
          "empty"
        ],
        "type": "object"
      },
      "PlotDataReading": {
        "description": "Requested data reading, shared by React context and the Plot data protocol.\nREPORT_RUN requires reportRunId; CURRENT requires null. Boundary validation\nenforces this cross-field invariant in every executor.",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/PlotDataReadingKind"
          },
          "reportRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "PlotDataReadingKind": {
        "description": "A live reading or one concrete Report run. Draft previews use CURRENT.",
        "enum": [
          "CURRENT",
          "REPORT_RUN"
        ],
        "type": "string"
      },
      "PlotDataResponse": {
        "description": "Tenant-facing Plot data page.\nNo storage-engine fields on this shape.",
        "properties": {
          "columns": {
            "items": {
              "$ref": "#/components/schemas/PlotDataColumn"
            },
            "type": "array"
          },
          "findings": {
            "description": "What Prepare would record for this Plot with the previewed SQL. Filled by\nweb-api only when the command carries SQL to preview on a draft ref; null\notherwise. Empty means Prepare would record nothing.",
            "items": {
              "$ref": "#/components/schemas/PlotPrepareFinding"
            },
            "nullable": true,
            "type": "array"
          },
          "meta": {
            "$ref": "#/components/schemas/PlotDataMeta"
          },
          "nextCursor": {
            "nullable": true,
            "type": "string"
          },
          "rows": {
            "items": {
              "$ref": "#/components/schemas/PlotDataRow"
            },
            "type": "array"
          }
        },
        "required": [
          "columns",
          "rows",
          "meta"
        ],
        "type": "object"
      },
      "PlotDataRow": {
        "description": "One response row (named type: psgen rejects nested array-of-array).",
        "properties": {
          "cells": {
            "description": "Cells in scalar-lib canonical JSON encoding, column order.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "type": "array"
          }
        },
        "required": [
          "cells"
        ],
        "type": "object"
      },
      "PlotDataSampleMeta": {
        "description": "Sample accounting when the read was forced-sampled (design-mode Current).",
        "properties": {
          "candidateCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "measuredCost": {
            "description": "Monetary amount in smallest currency unit (e.g., cents for USD)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "projectedFullRunCost": {
            "description": "Monetary amount in smallest currency unit (e.g., cents for USD)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "size": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "size",
          "candidateCount",
          "measuredCost"
        ],
        "type": "object"
      },
      "PlotDataSchemaStatus": {
        "enum": [
          "AVAILABLE",
          "UNAVAILABLE"
        ],
        "type": "string"
      },
      "PlotDataSortDirection": {
        "enum": [
          "asc",
          "desc"
        ],
        "type": "string"
      },
      "PlotDataSortTerm": {
        "properties": {
          "column": {
            "type": "string"
          },
          "dir": {
            "$ref": "#/components/schemas/PlotDataSortDirection"
          }
        },
        "required": [
          "column",
          "dir"
        ],
        "type": "object"
      },
      "PlotParableReportInput": {
        "description": "What Plot returns: the run it minted, so the picker can select it at once.",
        "properties": {
          "force": {
            "description": "Refresh everything (PARABLE-5767): every Pipeline recomputes, even one\nwhose inputs, plan and settings match an earlier Refresh. Null or false\nis Refresh, which reuses such a Pipeline's output. The run records it,\nand the audit trail names who forced it.",
            "nullable": true,
            "type": "boolean"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "preview": {
            "description": "True runs a Preview (PARABLE-6346): the whole Report end to end on a\nsample of the real data, stored and listed like a Refresh but never\nLatest, and kept for a shorter time. False or null runs a Refresh.",
            "nullable": true,
            "type": "boolean"
          },
          "proposalId": {
            "description": "The set of Changes to Preview, by ParableProposal.id; a Preview only.\nThe run reads the set as it stands when Preview is pressed. Null previews\nthe newest published Version.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reportKey": {
            "description": "An enabled Report in the captured published version. Null selects its only\nenabled Report; no selection or multiple choices require explicit setup.\nCreating a run never changes the authored definition.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "idempotencyKey"
        ],
        "type": "object"
      },
      "PlotPrepareCheckInput": {
        "description": "One Plot on a draft ref, with the SQL Preview runs for it. The check judges\nthat SQL as Prepare would judge the Plot, by the Plot's own execution path.\nIt never runs the SQL.",
        "properties": {
          "parameters": {
            "description": "Positional values for $1, $2, ... placeholders, as the query sends them.\nOmitted, null or empty means the SQL binds none.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "nullable": true,
            "type": "array"
          },
          "plotKey": {
            "description": "The Plot on that ref. A Plot that is not on the ref is a 404.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refId": {
            "description": "The draft ref the Plot is on. Prepare gates draft refs only.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sql": {
            "description": "The SQL Preview runs for the Plot, saved or not. Same bounds as the query's.",
            "maxLength": 100000,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "refId",
          "plotKey",
          "sql"
        ],
        "type": "object"
      },
      "PlotPrepareCheckResult": {
        "properties": {
          "findings": {
            "description": "What Prepare would record for the Plot with this SQL: the same evaluation,\nthe same codes and messages. Every finding blocks Prepare. Empty means\nPrepare would record nothing for this Plot.",
            "items": {
              "$ref": "#/components/schemas/PlotPrepareFinding"
            },
            "type": "array"
          }
        },
        "required": [
          "findings"
        ],
        "type": "object"
      },
      "PlotPrepareFinding": {
        "description": "One finding Prepare would record for a Plot, as Preview returns it (spec\n0084, Surfaces). Preview runs Prepare's own evaluation for the Plot it runs,\nso the code and message are the ones Prepare writes; every one blocks\nPrepare.",
        "properties": {
          "code": {
            "$ref": "#/components/schemas/ParablePrepareFindingCodeEnum"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "message"
        ],
        "type": "object"
      },
      "PlotProof": {
        "properties": {
          "assertion": {
            "description": "SQL text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemProofKindEnum"
          },
          "name": {
            "type": "string"
          },
          "plotPieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotRevision": {
            "$ref": "#/components/schemas/ParablePieceRevisionRef"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "kind",
          "problemId",
          "plotPieceId",
          "plotRevision",
          "assertion"
        ],
        "type": "object"
      },
      "PlotReadPaneValue": {
        "description": "Tenant-facing Plot data command.\nMust not carry schema/table/storage identity; the server resolves the target.\nFlat envelope: the ticket's `read` and `paginate` groupings are folded into\ntop-level fields, matching the spec's illustrative SDK call.\nA Pane's value as the reader sees it on screen, unsaved, sent with a Plot\nread so the Plot reads the reader's current filters (PARABLE-5675). web-api\nchecks it against the Pane's `preferences`.",
        "properties": {
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "value": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          }
        },
        "required": [
          "paneKey",
          "value"
        ],
        "type": "object"
      },
      "PlotValidationRecordView": {
        "description": "One PLOT_SQL implementation's validation result from the save that just ran\n(PARABLE-2697, spec 0084 \"Surfaces -- Save path\").\nReturned so the editor can render markers without a second round trip. The\npersisted record is `parable_piece_implementation.diagnostics`; this is a copy\nof it, echoed on the response of the save that produced it.",
        "properties": {
          "diagnostics": {
            "description": "The query-layer `PlotValidationDiagnostic[]`, verbatim.\nGeneric.JSON for the same reason the stored column is: the diagnostic type\nlives in the query-layer schema and this service does not import another\nservice's types. Restating its fields here would be a mirror, and the\nconsumer already reads the generated query-layer type. An empty array is\na completed clean validation; unavailable validation carries PV_SYS_001."
          },
          "implementationEntityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outputSchemaWritten": {
            "description": "This save wrote a trusted R8 output schema to the native Plot projection.\nFalse preserves the last-good schema. Sources with explicit parameters\nuse bound native planning instead of an unbound R8 schema observation.",
            "type": "boolean"
          },
          "plotEntityKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "plotEntityKey",
          "implementationEntityKey",
          "diagnostics",
          "outputSchemaWritten"
        ],
        "type": "object"
      },
      "PlottedPathBulletView": {
        "description": "One line of a step: a Font Awesome icon and a few words.",
        "properties": {
          "icon": {
            "description": "A Font Awesome class, such as `fa-solid fa-calendar-days`.",
            "type": "string"
          },
          "text": {
            "type": "string"
          }
        },
        "required": [
          "icon",
          "text"
        ],
        "type": "object"
      },
      "PlottedPathExplanation": {
        "description": "How an answer on a Pane came to be, from the tools its information comes\nfrom up to that Pane, for a reader who knows nothing about how a Parable is\nbuilt (Plotted Path, PARABLE-5951). Steps run from the tools to the Pane;\nthe first is where the information comes from.",
        "properties": {
          "generatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "mayRegenerate": {
            "description": "The reader publishes the Parable and may write it again.",
            "type": "boolean"
          },
          "model": {
            "description": "The model that wrote it.",
            "type": "string"
          },
          "sources": {
            "description": "The Provider tools the information comes from, by their slug\n(`google_calendar`), so the sheet can offer Connect for one the Workspace\nhas not connected.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "stale": {
            "description": "An explanation of an earlier map, shown while a new one is written.",
            "type": "boolean"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/PlottedPathStepView"
            },
            "type": "array"
          },
          "versionId": {
            "description": "The published Version explained; null for a set of Changes, whose\nexplanation is not kept.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "steps",
          "sources",
          "model",
          "generatedAt",
          "stale",
          "mayRegenerate"
        ],
        "type": "object"
      },
      "PlottedPathOpenView": {
        "description": "A part a step links: the reader opens it in a side panel.",
        "properties": {
          "description": {
            "description": "What the part shows or decides, in the reader's words.",
            "nullable": true,
            "type": "string"
          },
          "hasSettings": {
            "description": "People can change its settings.",
            "type": "boolean"
          },
          "name": {
            "description": "The part's name, as the reader sees it.",
            "type": "string"
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "paneKey",
          "name",
          "hasSettings"
        ],
        "type": "object"
      },
      "PlottedPathRequest": {
        "description": "A reader asks how an answer on a Pane came to be (Plotted Path,\nPARABLE-5951).",
        "properties": {
          "pageKey": {
            "description": "The Page it is shown on; its filter Policies apply to it.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "paneKey": {
            "description": "The Pane the reader pointed at.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "regenerate": {
            "description": "Write the explanation again even when one is kept. Only a seat that\npublishes the Parable may ask.",
            "nullable": true,
            "type": "boolean"
          }
        },
        "required": [
          "paneKey"
        ],
        "type": "object"
      },
      "PlottedPathStepView": {
        "description": "One step of the explanation.",
        "properties": {
          "bullets": {
            "items": {
              "$ref": "#/components/schemas/PlottedPathBulletView"
            },
            "type": "array"
          },
          "icon": {
            "description": "A Font Awesome class. The sheet numbers its steps and no longer draws it.",
            "type": "string"
          },
          "open": {
            "items": {
              "$ref": "#/components/schemas/PlottedPathOpenView"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "icon",
          "title",
          "bullets",
          "open"
        ],
        "type": "object"
      },
      "PonderChatError": {
        "description": "Failures a person hits while sending or continuing a Ponder message.\nDistinct from PonderApiRuntimeError, which is the server-to-server envelope\nponder-api returns to web-api. These codes travel in the chat problem\nresponse and in the Ponder conversation alert.\n\nRetired codes (never reuse): PA-CH-006 (WORKFLOW_MODE), retired with the\nVercel Workflow runtime by PARABLE-4956.\nPA-CH-008 (PERSONA_REQUIRED), PA-CH-009 (PROFILE_OVERRIDE_DUPLICATE),\nPA-CH-031 (PERSONA_CHANGED) and PA-CH-057 (STRUCTURED_ANSWER_INVALID),\nretired with Personas and their structured output by PARABLE-6164.",
        "enum": [
          "PA-CH-001",
          "PA-CH-002",
          "PA-CH-003",
          "PA-CH-004",
          "PA-CH-005",
          "PA-CH-007",
          "PA-CH-010",
          "PA-CH-011",
          "PA-CH-012",
          "PA-CH-013",
          "PA-CH-014",
          "PA-CH-015",
          "PA-CH-016",
          "PA-CH-017",
          "PA-CH-018",
          "PA-CH-019",
          "PA-CH-020",
          "PA-CH-021",
          "PA-CH-022",
          "PA-CH-023",
          "PA-CH-024",
          "PA-CH-025",
          "PA-CH-026",
          "PA-CH-027",
          "PA-CH-028",
          "PA-CH-029",
          "PA-CH-030",
          "PA-CH-032",
          "PA-CH-033",
          "PA-CH-034",
          "PA-CH-035",
          "PA-CH-036",
          "PA-CH-037",
          "PA-CH-038",
          "PA-CH-039",
          "PA-CH-040",
          "PA-CH-041",
          "PA-CH-042",
          "PA-CH-043",
          "PA-CH-044",
          "PA-CH-045",
          "PA-CH-046",
          "PA-CH-047",
          "PA-CH-048",
          "PA-CH-049",
          "PA-CH-050",
          "PA-CH-051",
          "PA-CH-052",
          "PA-CH-053",
          "PA-CH-054",
          "PA-CH-055",
          "PA-CH-056",
          "PA-CH-058",
          "PA-CH-059"
        ],
        "type": "string"
      },
      "PonderChatModelApiEnum": {
        "description": "The pi API adapter that answers a route.",
        "enum": [
          "ANTHROPIC_VERTEX",
          "GOOGLE_VERTEX",
          "OPENROUTER"
        ],
        "type": "string"
      },
      "PonderChatModelChoice": {
        "additionalProperties": false,
        "description": "What a person picks in the composer for one turn (PARABLE-6164). The\nbrowser, MCP and the Pane bridge send it; web-api resolves it to a\nPonderChatModelRoute. Every entry of the model list is one model on one pi\nprovider, named `server:harness:account` as in the Ponder desktop app; v1\nhas only the Parable-hosted `vertex:pi:parable` and `openrouter:pi:parable`.\nCustomers see \"Parable\" as the server, never the cloud behind it.",
        "properties": {
          "effort": {
            "description": "The effort level. For Ponder it is `simple`, `standard` or `strong`; for\nany other model it is one of that model's models.dev effort levels. Null\nmeans Default: the server decides, and for Ponder that is `standard`.",
            "maxLength": 32,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "entry": {
            "description": "The pi provider id `server:harness:account`, such as `vertex:pi:parable`.",
            "maxLength": 300,
            "minLength": 1,
            "type": "string"
          },
          "model": {
            "description": "The models.dev key `lab/model`, such as `anthropic/claude-sonnet-5-5`, or `parable/ponder` for Ponder.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "speed": {
            "description": "A models.dev speed mode id, such as `fast`. Null means normal speed.",
            "maxLength": 32,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "entry",
          "model"
        ],
        "type": "object"
      },
      "PonderChatModelCost": {
        "additionalProperties": false,
        "description": "A model's list prices from models.dev, in micro-USD per million tokens: the\ncatalog's amountMicros over a meterQuantity of 1,000,000, so $3 per million\ntokens is 3000000. Whole numbers keep a route inside a Run's dispatch digest,\nwhich takes no floats.",
        "properties": {
          "cacheRead": {
            "description": "Null when models.dev lists no cache read price.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "cacheWrite": {
            "description": "Null when models.dev lists no cache write price.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "input": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "output": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "tiers": {
            "description": "The context tiers, smallest contextOver first. A call pays the prices of\nthe largest tier its prompt is larger than, else the prices above. Null\nwhen models.dev lists no tier.",
            "items": {
              "$ref": "#/components/schemas/PonderChatModelCostTier"
            },
            "maxItems": 16,
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "input",
          "output"
        ],
        "type": "object"
      },
      "PonderChatModelCostTier": {
        "additionalProperties": false,
        "description": "A models.dev context tier: the list prices of a call whose prompt is larger\nthan contextOver tokens. The prompt is the call's input tokens with its\ncache reads and cache writes; output does not count. A price the tier does\nnot list is the base price, already filled in by web-api.",
        "properties": {
          "cacheRead": {
            "description": "Null when models.dev lists no cache read price.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "cacheWrite": {
            "description": "Null when models.dev lists no cache write price.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "contextOver": {
            "description": "The prompt size in tokens above which the tier's prices apply, such as 200000.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "input": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "output": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "contextOver",
          "input",
          "output"
        ],
        "type": "object"
      },
      "PonderChatModelEffortOption": {
        "description": "One effort level a model offers.",
        "properties": {
          "id": {
            "description": "The level's id, such as `high`, or `standard` for Ponder.",
            "type": "string"
          },
          "name": {
            "description": "The level's name, such as \"Extra high\".",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PonderChatModelEntryView": {
        "description": "One entry of the model list: one model on one pi provider.",
        "properties": {
          "available": {
            "description": "False when this Workspace cannot use the entry now.",
            "type": "boolean"
          },
          "contextTokenLimit": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "cost": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderChatModelCost"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "defaultEffort": {
            "description": "The level Default means: `standard` for Ponder. Null for any other model,\nwhose server picks its own level when none is sent.",
            "nullable": true,
            "type": "string"
          },
          "efforts": {
            "description": "The effort levels, lowest first. Empty when the model has none.",
            "items": {
              "$ref": "#/components/schemas/PonderChatModelEffortOption"
            },
            "type": "array"
          },
          "entry": {
            "description": "The pi provider id `server:harness:account`.",
            "type": "string"
          },
          "family": {
            "description": "The model family that groups releases, such as `claude-sonnet`; null when models.dev gives none.",
            "nullable": true,
            "type": "string"
          },
          "familyName": {
            "nullable": true,
            "type": "string"
          },
          "hidden": {
            "description": "True when a Workspace admin hid the entry from the picker.",
            "type": "boolean"
          },
          "imageInput": {
            "type": "boolean"
          },
          "labId": {
            "description": "The models.dev lab id, such as `anthropic`.",
            "type": "string"
          },
          "labName": {
            "type": "string"
          },
          "model": {
            "description": "The models.dev key, or `parable/ponder`.",
            "type": "string"
          },
          "name": {
            "description": "The model's display name, such as \"Claude Sonnet 5.5\".",
            "type": "string"
          },
          "position": {
            "description": "The entry's place in the order the picker offers, from 0.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "releasedOn": {
            "description": "Calendar date, normalized to ISO 'YYYY-MM-DD'. Accepts ISO ('2025-01-01'), slash-separated ('2025/01/15', '01/15/2025'), named-month ('January 15, 2025', 'Jan 15, 2025'), and full RFC3339 datetime (the time portion is dropped).",
            "format": "date",
            "maxLength": 40,
            "nullable": true,
            "type": "string"
          },
          "serverName": {
            "description": "The server name a person sees. Always \"Parable\" in v1.",
            "type": "string"
          },
          "speeds": {
            "description": "The speed modes beyond normal. Empty when the model has none.",
            "items": {
              "$ref": "#/components/schemas/PonderChatModelSpeedOption"
            },
            "type": "array"
          },
          "tagline": {
            "description": "One line on what the model is good at.",
            "nullable": true,
            "type": "string"
          },
          "unavailableReason": {
            "description": "Why the entry is unavailable, in words a person reads; null when it is available.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "entry",
          "model",
          "name",
          "labId",
          "labName",
          "serverName",
          "available",
          "efforts",
          "speeds",
          "imageInput",
          "position",
          "hidden"
        ],
        "type": "object"
      },
      "PonderChatModelListView": {
        "description": "The model list for this Workspace, in offer order.",
        "properties": {
          "items": {
            "description": "Every entry, Ponder first.",
            "items": {
              "$ref": "#/components/schemas/PonderChatModelEntryView"
            },
            "type": "array"
          },
          "ponder": {
            "$ref": "#/components/schemas/PonderChatModelEntryView",
            "description": "The Ponder entry, which is also items[0]."
          },
          "refreshedAt": {
            "description": "When the models.dev list was last read; null before the first read.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "items",
          "ponder"
        ],
        "type": "object"
      },
      "PonderChatModelOrderEntry": {
        "additionalProperties": false,
        "description": "One entry in a Workspace's offer order.",
        "properties": {
          "entry": {
            "maxLength": 300,
            "minLength": 1,
            "type": "string"
          },
          "hidden": {
            "type": "boolean"
          },
          "model": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "entry",
          "model",
          "hidden"
        ],
        "type": "object"
      },
      "PonderChatModelRoute": {
        "additionalProperties": false,
        "description": "The one model web-api resolved for a turn, which ponder-api hands to pi. It\nis the desktop app's route file entry for that turn.",
        "properties": {
          "account": {
            "description": "The account part of choice.entry: `parable`.",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "api": {
            "$ref": "#/components/schemas/PonderChatModelApiEnum"
          },
          "choice": {
            "$ref": "#/components/schemas/PonderChatModelChoice",
            "description": "What the person picked."
          },
          "contextTokenLimit": {
            "description": "The context window in tokens; null when models.dev gives none.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "cost": {
            "description": "List prices; null when models.dev gives none.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderChatModelCost"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "effort": {
            "description": "The provider's effort level after mapping (a Ponder level becomes its\nmodel's level): `none`, `minimal`, `low`, `medium`, `high`, `xhigh` or\n`max`. Null sends no effort, so the provider's default applies.",
            "maxLength": 32,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "harness": {
            "description": "The harness part of choice.entry: `pi`.",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "imageInput": {
            "type": "boolean"
          },
          "modelId": {
            "description": "The pi model id `parable-ponder-\u003cmodel tail\u003e-\u003cpick\u003e`, as the desktop app's\nPonderPiConfig names it. The model tail is the served models.dev key after\nits first `/`, with `/`, `:` and whitespace replaced by `-`; the pick is\nthe effort, or `default`.",
            "maxLength": 300,
            "minLength": 1,
            "type": "string"
          },
          "name": {
            "description": "The display name, such as `Ponder · Standard` or `Claude Sonnet 5.5 · High`.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "outputTokenLimit": {
            "description": "The largest answer in tokens; null when models.dev gives none.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "processor": {
            "$ref": "#/components/schemas/ModelProcessor",
            "description": "VERTEX or OPENROUTER_ZDR: the processor the conversation is sent to."
          },
          "providerId": {
            "description": "The pi provider id `server:harness:account`; it equals choice.entry.",
            "maxLength": 300,
            "minLength": 1,
            "type": "string"
          },
          "reasoning": {
            "type": "boolean"
          },
          "servedModel": {
            "description": "The models.dev key of the model that answers. For Ponder it is the effort level's model.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "server": {
            "description": "The server part of choice.entry: `vertex` or `openrouter`.",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "speedBody": {
            "description": "The request body fields of the models.dev mode for the chosen speed, merged\ninto the request. Null at normal speed. A Run seals the route in its\ndispatch digest, which takes whole numbers only.",
            "nullable": true
          },
          "speedHeaders": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "The request headers of the models.dev mode for the chosen speed. Null at normal speed.",
            "nullable": true,
            "type": "object"
          },
          "vertexLocation": {
            "description": "The Vertex location that serves the model, such as `global` or `us-east5`. Null off Vertex.",
            "maxLength": 100,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "vertexProject": {
            "description": "The Google Cloud project for a Vertex route: the Workspace's own when it\nis ready, else null for the environment's shared project. Null off Vertex.",
            "maxLength": 100,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "wireModelId": {
            "description": "The server's own model id: on Vertex as models.dev's api.json lists it, on OpenRouter its slug.",
            "maxLength": 300,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "choice",
          "server",
          "harness",
          "account",
          "providerId",
          "modelId",
          "servedModel",
          "name",
          "api",
          "wireModelId",
          "processor",
          "reasoning",
          "imageInput"
        ],
        "type": "object"
      },
      "PonderChatModelSpeedOption": {
        "description": "One speed mode a model offers beyond normal.",
        "properties": {
          "id": {
            "description": "The models.dev mode id, such as `fast`.",
            "type": "string"
          },
          "multiplier": {
            "description": "How many times the normal price the mode costs; null when models.dev does not say.",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PonderCleanupCorrection": {
        "description": "One word or phrase cleanup replaced.",
        "properties": {
          "original": {
            "type": "string"
          },
          "replacement": {
            "type": "string"
          }
        },
        "required": [
          "original",
          "replacement"
        ],
        "type": "object"
      },
      "PonderCleanupInput": {
        "properties": {
          "rootRefId": {
            "description": "The root ref of the Parable being viewed. Its participants and the Problems you can read join the glossary; you must be able to see the Parable. Omit it outside a Parable.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/PonderCleanupSourceEnum"
          },
          "text": {
            "maxLength": 8000,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "text",
          "source"
        ],
        "type": "object"
      },
      "PonderCleanupResult": {
        "properties": {
          "changed": {
            "type": "boolean"
          },
          "corrections": {
            "description": "The words Jev chose to replace, in order. Spacing, casing and punctuation fixes are not listed.",
            "items": {
              "$ref": "#/components/schemas/PonderCleanupCorrection"
            },
            "type": "array"
          },
          "model": {
            "description": "The Jev release that chose them; empty when nothing was asked.",
            "type": "string"
          },
          "text": {
            "description": "The cleaned text: the person's own words, with only the listed corrections and spacing, casing and closing punctuation fixed.",
            "type": "string"
          }
        },
        "required": [
          "text",
          "changed",
          "corrections",
          "model"
        ],
        "type": "object"
      },
      "PonderCleanupSourceEnum": {
        "enum": [
          "typed",
          "dictated"
        ],
        "type": "string"
      },
      "PonderColorSchemeEnum": {
        "enum": [
          "light",
          "dark"
        ],
        "type": "string"
      },
      "PonderLanguageInput": {
        "description": "One of Ponder's one-shot language calls (PONDER_LANGUAGE, PARABLE-5951): a\nprompt in, text or JSON out, outside any conversation and remembered by\nnone. The Workspace's model policy picks the model and routes it through\nOpenRouter with zero data retention; each field below has a default.",
        "properties": {
          "maxOutputTokens": {
            "description": "The most tokens the answer may take. Null is 8,000.",
            "format": "int64",
            "maximum": 32000,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "model": {
            "description": "An OpenRouter model id the Workspace's policy allows for these calls,\nsuch as `~anthropic/claude-haiku-latest`. Null uses the policy's model.",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "prompt": {
            "description": "The material to work on.",
            "maxLength": 120000,
            "minLength": 1,
            "type": "string"
          },
          "purpose": {
            "description": "What the call is for, such as `summary`, recorded with its usage.",
            "maxLength": 60,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][a-z0-9-]*$",
            "type": "string"
          },
          "reasoningEffort": {
            "description": "How hard the model reasons. Null is `medium`.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderReasoningEffortEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "responseSchema": {
            "description": "A JSON Schema the answer must match. When set, the answer is that JSON,\nreturned parsed in `json`.",
            "nullable": true
          },
          "system": {
            "description": "The instructions: what to do, for whom, and in what form.",
            "maxLength": 40000,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "prompt"
        ],
        "type": "object"
      },
      "PonderLanguageResult": {
        "description": "What a language call answered (PARABLE-5951).",
        "properties": {
          "elapsedMs": {
            "description": "How long the call took, in milliseconds.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "inputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "json": {
            "description": "The answer parsed, when a response schema was asked for.",
            "nullable": true
          },
          "model": {
            "description": "The model that answered. For an alias such as\n`~anthropic/claude-haiku-latest`, the model it resolved to, so a change\nshows.",
            "type": "string"
          },
          "outputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "processor": {
            "$ref": "#/components/schemas/ModelProcessor"
          },
          "reasoningTokens": {
            "description": "The part of outputTokens the model spent reasoning, when stated.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "text": {
            "description": "The answer as the model wrote it.",
            "type": "string"
          }
        },
        "required": [
          "text",
          "model",
          "processor",
          "inputTokens",
          "outputTokens",
          "reasoningTokens",
          "elapsedMs"
        ],
        "type": "object"
      },
      "PonderModelChoice": {
        "additionalProperties": false,
        "description": "The coordinates of a ponder() or model() call, for SQL_MODEL. The processor\nis the one the coordinates' server names: `vertex` is VERTEX, `anthropic` is\nANTHROPIC, and `openrouter` is OPENROUTER_ZDR.",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ModelChoiceKind"
          },
          "model": {
            "$ref": "#/components/schemas/PonderModelConfig"
          },
          "processor": {
            "$ref": "#/components/schemas/ModelProcessor"
          }
        },
        "required": [
          "kind",
          "model",
          "processor"
        ],
        "type": "object"
      },
      "PonderModelConfig": {
        "description": "Model coordinates and per-call inference settings packed by the ponder()\nand model() SQL functions. The model policy's SQL_MODEL choice\n(PonderModelChoice) carries the same coordinates.",
        "properties": {
          "date": {
            "type": "string"
          },
          "effort": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          },
          "request_timeout_secs": {
            "description": "Signed integer count of seconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "server": {
            "type": "string"
          },
          "tokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "variant": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "provider",
          "name",
          "variant",
          "version",
          "date",
          "effort",
          "server"
        ],
        "type": "object"
      },
      "PonderParableAvailableTool": {
        "description": "One authorized generated operation for this Message; the ordinary path ships no input schema until inspection.",
        "properties": {
          "approvalPolicy": {
            "$ref": "#/components/schemas/ParableProblemRunToolApprovalPolicyEnum"
          },
          "availability": {
            "$ref": "#/components/schemas/PonderParableToolAvailabilityEnum"
          },
          "capability": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "effectivePersonaPolicy": {
            "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum"
          },
          "guidance": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderParableOperationGuidance"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "iconName": {
            "type": "string"
          },
          "inputSchema": {
            "description": "Any valid JSON value: object, array, primitive, or null",
            "nullable": true
          },
          "inputSchemaDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "operationId": {
            "type": "string"
          },
          "surface": {
            "$ref": "#/components/schemas/PonderParableOperationSurfaceEnum"
          },
          "title": {
            "type": "string"
          },
          "toolName": {
            "type": "string"
          }
        },
        "required": [
          "toolName",
          "operationId",
          "title",
          "description",
          "iconName",
          "capability",
          "approvalPolicy",
          "effectivePersonaPolicy",
          "inputSchemaDigest",
          "surface",
          "availability"
        ],
        "type": "object"
      },
      "PonderParableChatRequest": {
        "additionalProperties": false,
        "description": "The Parable coordinates a browser adds to one ordinary Ponder send. The\nsurrounding AI SDK chat transport envelope (id, messages, trigger,\nmessageId) is the SDK's own third-party wire format; only these fields are\nParable's. The Message UUID inside that envelope is the sole request\nidentity: there is no Run contract, Problem revision, or Run dispatch input\non this path.",
        "properties": {
          "contextSelection": {
            "$ref": "#/components/schemas/ParableProblemContextSelectionInput"
          },
          "currentView": {
            "description": "Per-Message orientation; it never attaches durable context to the shared Problem.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProblemCurrentView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "debugRequested": {
            "type": "boolean"
          },
          "model": {
            "description": "The model the person picked in the composer (PARABLE-6164). Null from a\nbrowser that predates the field; web-api then uses Ponder Standard.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderChatModelChoice"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "operationSurface": {
            "$ref": "#/components/schemas/PonderParableOperationSurfaceEnum",
            "description": "Which surface is asking; Admin Ponder is gated on this before the Message is prepared."
          },
          "performance": {
            "description": "The person's Performance recording for the Parable in view, sent with each\nMessage while they record (PARABLE-5480). Measurements only: it is never\nstored, and Ponder reads it with its readPerformance tool.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePerformanceRecording"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "skillIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 20,
            "minItems": 0,
            "type": "array"
          },
          "viewport": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderViewport"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "operationSurface",
          "problemId",
          "contextSelection",
          "skillIds",
          "debugRequested"
        ],
        "type": "object"
      },
      "PonderParableCommittedExecution": {
        "additionalProperties": false,
        "description": "Model route, instructions, and Skills committed when a signed approval was\nissued. The continuation replays them verbatim.",
        "properties": {
          "instructionsDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "operationSurface": {
            "$ref": "#/components/schemas/PonderParableOperationSurfaceEnum"
          },
          "route": {
            "$ref": "#/components/schemas/PonderChatModelRoute",
            "description": "The model route committed with the approval; the continuation runs it again."
          },
          "skillIds": {
            "description": "Re-resolve these accepted Skills when an approval is resumed after reload.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 20,
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "operationSurface",
          "route",
          "instructionsDigest",
          "skillIds"
        ],
        "type": "object"
      },
      "PonderParableOperationGuidance": {
        "properties": {
          "doNotUseWhen": {
            "type": "string"
          },
          "errors": {
            "items": {
              "$ref": "#/components/schemas/PonderParableOperationGuidanceError"
            },
            "type": "array"
          },
          "success": {
            "type": "string"
          },
          "useWhen": {
            "type": "string"
          }
        },
        "required": [
          "useWhen",
          "doNotUseWhen",
          "success",
          "errors"
        ],
        "type": "object"
      },
      "PonderParableOperationGuidanceError": {
        "description": "Schema-owned decision support included when a Message discovers an operation.",
        "properties": {
          "code": {
            "type": "string"
          },
          "commonCorrection": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "description",
          "commonCorrection"
        ],
        "type": "object"
      },
      "PonderParableOperationSurfaceEnum": {
        "description": "Ordinary Ponder exchange kinds; only Parable threads today.\nAccepted operation transport for one ordinary Message; it is not a Run grant.",
        "enum": [
          "workspace",
          "admin"
        ],
        "type": "string"
      },
      "PonderParableToolAvailabilityEnum": {
        "description": "When an authorized generated operation can run for this Message.",
        "enum": [
          "available_now"
        ],
        "type": "string"
      },
      "PonderPersonaProfileOverride": {
        "description": "Historical: a private copy of one Persona profile ranking, held by Runs started before PARABLE-6164.",
        "properties": {
          "rankedModels": {
            "items": {
              "$ref": "#/components/schemas/PonderPersonaRankedModelOverride"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "slot": {
            "$ref": "#/components/schemas/PersonaPersonalitySlotEnum"
          }
        },
        "required": [
          "slot",
          "rankedModels"
        ],
        "type": "object"
      },
      "PonderPersonaPromotesFieldDefinition": {
        "description": "Historical schema field retained solely to decode sealed Run snapshots.",
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "key": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderPersonaPromotesFieldKindEnum"
          },
          "name": {
            "type": "string"
          },
          "rank": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "required": {
            "type": "boolean"
          }
        },
        "required": [
          "key",
          "name",
          "kind",
          "required",
          "rank"
        ],
        "type": "object"
      },
      "PonderPersonaPromotesFieldKindEnum": {
        "enum": [
          "short_text",
          "markdown",
          "boolean",
          "number",
          "actor",
          "problem"
        ],
        "type": "string"
      },
      "PonderPersonaPromotesSchema": {
        "description": "Historical orientation schema; current Personas use a shared prompt and graph filter.",
        "properties": {
          "defaultGraphFilter": {
            "$ref": "#/components/schemas/PonderProblemGraphFilter"
          },
          "fields": {
            "items": {
              "$ref": "#/components/schemas/PonderPersonaPromotesFieldDefinition"
            },
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "fields",
          "defaultGraphFilter"
        ],
        "type": "object"
      },
      "PonderPersonaRankedModelOverride": {
        "properties": {
          "configYaml": {
            "maxLength": 16384,
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "modelReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "modelReleaseId",
          "enabled",
          "configYaml"
        ],
        "type": "object"
      },
      "PonderPersonaToolPolicyEnum": {
        "description": "Delegated Ponder use of one generated Workspace operation. The name is\nhistorical: it is per-operation tool policy, not a Persona setting.",
        "enum": [
          "never",
          "ask",
          "always"
        ],
        "type": "string"
      },
      "PonderPickInput": {
        "properties": {
          "question": {
            "$ref": "#/components/schemas/JudgmentChoiceQuestion"
          },
          "state": {
            "description": "What the choice is about: text, or JSON with named parts."
          }
        },
        "required": [
          "question",
          "state"
        ],
        "type": "object"
      },
      "PonderPickResult": {
        "properties": {
          "choice": {
            "type": "string"
          },
          "confidence": {
            "description": "How concentrated the final round's distribution is; near-synonyms spread it. Not a correctness score.",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "groupsKept": {
            "description": "Groups carried into the member round; empty without groups.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "judgment": {
            "$ref": "#/components/schemas/JudgmentProvenance"
          },
          "optionsConsidered": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "probabilities": {
            "additionalProperties": {
              "description": "Probability value from 0.0 to 1.0 inclusive",
              "format": "double",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "description": "The final round's distribution: every finalist, not every option.",
            "type": "object"
          },
          "rounds": {
            "description": "1 when every option fit one question.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "choice",
          "confidence",
          "probabilities",
          "rounds",
          "optionsConsidered",
          "groupsKept",
          "judgment"
        ],
        "type": "object"
      },
      "PonderPingPossibilityView": {
        "properties": {
          "cons": {
            "items": {
              "description": "Markdown text",
              "pattern": "^[\\s\\S]*$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "pros": {
            "items": {
              "description": "Markdown text",
              "pattern": "^[\\s\\S]*$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "summary": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "summary",
          "pros",
          "cons"
        ],
        "type": "object"
      },
      "PonderPingQuestionView": {
        "properties": {
          "header": {
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "modality": {
            "$ref": "#/components/schemas/ProblemPingQuestionModalityEnum"
          },
          "possibilities": {
            "items": {
              "$ref": "#/components/schemas/PonderPingPossibilityView"
            },
            "maxItems": 200,
            "minItems": 0,
            "type": "array"
          },
          "question": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "header",
          "question",
          "modality",
          "possibilities"
        ],
        "type": "object"
      },
      "PonderPowerToolView": {
        "description": "One generated tool in a Power's Tools tab; JSON Schema is fetched separately for one exact handle.",
        "properties": {
          "areaKey": {
            "description": "The area the tool belongs to: the built-in Power it starts in, for grouping.",
            "maxLength": 64,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "areaTitle": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "description": {
            "description": "Markdown text",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "effectivePolicy": {
            "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum",
            "description": "What Ponder does before calling the tool: the Workspace default, else the operation default."
          },
          "effectiveSource": {
            "$ref": "#/components/schemas/PonderToolPolicySourceEnum"
          },
          "handle": {
            "maxLength": 48,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$",
            "type": "string"
          },
          "iconName": {
            "type": "string"
          },
          "namespace": {
            "type": "string"
          },
          "operationDefault": {
            "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum"
          },
          "required": {
            "description": "Always available to Ponder and never removable, so Ponder can always find and read Powers.",
            "type": "boolean"
          },
          "title": {
            "maxLength": 160,
            "minLength": 1,
            "type": "string"
          },
          "used": {
            "description": "In this Power: the built-in defaults with the Workspace's additions and removals applied.",
            "type": "boolean"
          },
          "workspaceDefault": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "required": [
          "handle",
          "title",
          "description",
          "iconName",
          "namespace",
          "operationDefault",
          "effectivePolicy",
          "effectiveSource",
          "used",
          "required",
          "areaKey",
          "areaTitle"
        ],
        "type": "object"
      },
      "PonderPowerToolsView": {
        "description": "Every generated tool Ponder may use, marked for one Power, in area order then title. A tool in no Power is never offered.",
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PonderPowerToolView"
            },
            "maxItems": 1000,
            "minItems": 0,
            "type": "array"
          },
          "membershipDigest": {
            "description": "Digest of this Power's stored tool changes; send it back as expectedMembershipDigest when saving.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "powerId": {
            "description": "Null lists the catalog for a Power that is not saved yet; nothing is used.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "registryDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "workspacePolicyRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "registryDigest",
          "workspacePolicyRevision",
          "membershipDigest"
        ],
        "type": "object"
      },
      "PonderPrioritizeInput": {
        "properties": {
          "items": {
            "additionalProperties": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "description": "Item key to its state. Each item is scored on its own; 1 to 100 items.",
            "type": "object"
          },
          "question": {
            "$ref": "#/components/schemas/JudgmentScoreQuestion"
          }
        },
        "required": [
          "question",
          "items"
        ],
        "type": "object"
      },
      "PonderPrioritizeResult": {
        "properties": {
          "judgment": {
            "$ref": "#/components/schemas/JudgmentProvenance"
          },
          "ranked": {
            "description": "Highest score first.",
            "items": {
              "$ref": "#/components/schemas/PonderPrioritizedItem"
            },
            "type": "array"
          }
        },
        "required": [
          "ranked",
          "judgment"
        ],
        "type": "object"
      },
      "PonderPrioritizedItem": {
        "properties": {
          "confidence": {
            "description": "Probability value from 0.0 to 1.0 inclusive",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "key": {
            "type": "string"
          },
          "probabilities": {
            "additionalProperties": {
              "description": "Probability value from 0.0 to 1.0 inclusive",
              "format": "double",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "description": "Level index, as text, to its probability.",
            "type": "object"
          },
          "score": {
            "description": "Probability-weighted position on the levels: 0 is the first level.",
            "format": "double",
            "type": "number"
          }
        },
        "required": [
          "key",
          "score",
          "confidence",
          "probabilities"
        ],
        "type": "object"
      },
      "PonderProbeInput": {
        "properties": {
          "question": {
            "$ref": "#/components/schemas/JudgmentProbeQuestion"
          },
          "state": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          }
        },
        "required": [
          "question",
          "state"
        ],
        "type": "object"
      },
      "PonderProbeResult": {
        "properties": {
          "judgment": {
            "$ref": "#/components/schemas/JudgmentProvenance"
          },
          "probability": {
            "description": "Probability that the answer is yes. Near 0.5 means uncertain, not \"somewhat\".",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "probability",
          "judgment"
        ],
        "type": "object"
      },
      "PonderProblemGraphFilter": {
        "description": "Default graph orientation used when a Persona works or discovers Problems.",
        "properties": {
          "includePocketed": {
            "type": "boolean"
          },
          "resolutions": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemResolutionStatusEnum"
            },
            "minItems": 0,
            "type": "array"
          },
          "responsibilityRoles": {
            "items": {
              "$ref": "#/components/schemas/ParableRaciRoleEnum"
            },
            "minItems": 0,
            "type": "array"
          },
          "stages": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemStageEnum"
            },
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "includePocketed",
          "stages",
          "resolutions",
          "responsibilityRoles"
        ],
        "type": "object"
      },
      "PonderProof": {
        "properties": {
          "description": {
            "nullable": true,
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemProofKindEnum"
          },
          "modelReleaseIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "name": {
            "type": "string"
          },
          "personaId": {
            "description": "First-class Persona identity for current Proofs.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personaParableId": {
            "description": "Historical Persona-as-Parable identity; old Proof revisions stay readable.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personaResolutionDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "problemId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "handle",
          "kind",
          "problemId",
          "runId",
          "personaResolutionDigest",
          "modelReleaseIds"
        ],
        "type": "object"
      },
      "PonderReasoningEffortEnum": {
        "description": "How hard a model reasons before it answers one of Ponder's language calls\n(PARABLE-5951). `off` turns reasoning off: faster, and on Haiku Latest it\nexplained Plotted Path in the wrong direction (2026-10-11); `medium` is the\ndefault; `high` was about 2.5 times slower than medium there.",
        "enum": [
          "off",
          "low",
          "medium",
          "high"
        ],
        "type": "string"
      },
      "PonderRunApprovalDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "approvalId": {
            "nullable": true,
            "type": "string"
          },
          "argumentsDigest": {
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "operationId": {
            "type": "string"
          },
          "operationName": {
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "kind",
          "operationName",
          "operationId",
          "argumentsDigest",
          "status"
        ],
        "type": "object"
      },
      "PonderRunCompletionDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "durationMs": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "externalCallCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "failureCode": {
            "nullable": true,
            "type": "string"
          },
          "inputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "modelRequestCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "outputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "reasoningSummary": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "kind",
          "status"
        ],
        "type": "object"
      },
      "PonderRunDebugPolicySnapshot": {
        "properties": {
          "authorizedActorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "diagnosticInstruction": {
            "description": "Markdown text",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "policyVersion": {
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "authorizedActorId",
          "policyVersion"
        ],
        "type": "object"
      },
      "PonderRunDiagnosticEventKindEnum": {
        "description": "What a Run's diagnostic event records. Each kind has its own payload, a\nmember of PonderRunDiagnosticPayload. web_db's\nparable_problem_run_diagnostic_event_kind_check holds the column to these\nvalues; add a member and widen that constraint together.",
        "enum": [
          "dispatch",
          "segment_started",
          "segment_ended",
          "model_attempt",
          "model_failover",
          "tool_discovery",
          "tool_call",
          "approval",
          "related_problem",
          "promotes_update",
          "usage",
          "retry",
          "receipt",
          "completion"
        ],
        "type": "string"
      },
      "PonderRunDiagnosticPayload": {
        "description": "The safe payload of a Run's diagnostic event, chosen by its kind.",
        "discriminator": {
          "mapping": {
            "approval": "#/components/schemas/PonderRunApprovalDiagnostic",
            "completion": "#/components/schemas/PonderRunCompletionDiagnostic",
            "dispatch": "#/components/schemas/PonderRunDispatchDiagnostic",
            "model_attempt": "#/components/schemas/PonderRunModelAttemptDiagnostic",
            "model_failover": "#/components/schemas/PonderRunModelFailoverDiagnostic",
            "promotes_update": "#/components/schemas/PonderRunPromotesUpdateDiagnostic",
            "receipt": "#/components/schemas/PonderRunReceiptDiagnostic",
            "related_problem": "#/components/schemas/PonderRunRelatedProblemDiagnostic",
            "retry": "#/components/schemas/PonderRunRetryDiagnostic",
            "segment_ended": "#/components/schemas/PonderRunSegmentEndedDiagnostic",
            "segment_started": "#/components/schemas/PonderRunSegmentStartedDiagnostic",
            "tool_call": "#/components/schemas/PonderRunToolCallDiagnostic",
            "tool_discovery": "#/components/schemas/PonderRunToolDiscoveryDiagnostic",
            "usage": "#/components/schemas/PonderRunUsageDiagnostic"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/PonderRunDispatchDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunSegmentStartedDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunSegmentEndedDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunModelAttemptDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunModelFailoverDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunToolDiscoveryDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunToolCallDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunApprovalDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunRelatedProblemDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunPromotesUpdateDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunUsageDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunRetryDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunReceiptDiagnostic"
          },
          {
            "$ref": "#/components/schemas/PonderRunCompletionDiagnostic"
          }
        ]
      },
      "PonderRunDiagnosticRetryReasonEnum": {
        "description": "Why a structured answer's try failed.",
        "enum": [
          "invalid_answer",
          "answered_in_prose"
        ],
        "type": "string"
      },
      "PonderRunDiagnosticRetryTargetEnum": {
        "description": "What a retry tried again.",
        "enum": [
          "model_route",
          "generated_operation",
          "structured_answer"
        ],
        "type": "string"
      },
      "PonderRunDispatchDiagnostic": {
        "additionalProperties": false,
        "description": "A Run's dispatch: what it was sealed with, or why it failed at start.",
        "properties": {
          "configDigest": {
            "nullable": true,
            "type": "string"
          },
          "contextDigest": {
            "nullable": true,
            "type": "string"
          },
          "debugPolicyVersion": {
            "nullable": true,
            "type": "string"
          },
          "executionPolicyDigest": {
            "nullable": true,
            "type": "string"
          },
          "failureCode": {
            "description": "The code the Run failed with at start.",
            "maxLength": 50,
            "nullable": true,
            "pattern": "^[A-Z_][A-Z0-9_]*$",
            "type": "string"
          },
          "failureReason": {
            "nullable": true,
            "type": "string"
          },
          "failureStage": {
            "description": "The check that refused the Run at start.",
            "nullable": true,
            "type": "string"
          },
          "graphDigest": {
            "nullable": true,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "modelCandidateCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "personaDigest": {
            "nullable": true,
            "type": "string"
          },
          "policyDigest": {
            "nullable": true,
            "type": "string"
          },
          "promotesDigest": {
            "nullable": true,
            "type": "string"
          },
          "reasoningSummary": {
            "nullable": true,
            "type": "string"
          },
          "toolGrantDigest": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "PonderRunModelAttemptDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "adapter": {
            "nullable": true,
            "type": "string"
          },
          "attempt": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "durationMs": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "failureCode": {
            "nullable": true,
            "type": "string"
          },
          "inputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "modelReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "rank": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "reasoningSummary": {
            "nullable": true,
            "type": "string"
          },
          "retryable": {
            "nullable": true,
            "type": "boolean"
          },
          "routeBindingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "routeModelId": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "kind",
          "rank",
          "status",
          "attempt"
        ],
        "type": "object"
      },
      "PonderRunModelFailoverDiagnostic": {
        "additionalProperties": false,
        "description": "The Run moved from one ranked model to the next (PARABLE-5059).",
        "properties": {
          "failureCode": {
            "description": "Why the earlier rank stopped: its model failed upstream, or could not be built.",
            "maxLength": 50,
            "pattern": "^[A-Z_][A-Z0-9_]*$",
            "type": "string"
          },
          "fromRank": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "toRank": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "fromRank",
          "toRank",
          "failureCode"
        ],
        "type": "object"
      },
      "PonderRunPromotesUpdateDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "personaId": {
            "nullable": true,
            "type": "string"
          },
          "problemId": {
            "type": "string"
          },
          "schemaDigest": {
            "nullable": true,
            "type": "string"
          },
          "stale": {
            "nullable": true,
            "type": "boolean"
          },
          "updatedAt": {
            "nullable": true,
            "type": "string"
          },
          "valuesDigest": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "kind",
          "problemId"
        ],
        "type": "object"
      },
      "PonderRunReceiptDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "changedResourceIds": {
            "items": {
              "type": "string"
            },
            "maxItems": 100,
            "type": "array"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "operationId": {
            "type": "string"
          },
          "operationName": {
            "type": "string"
          },
          "receiptId": {
            "type": "string"
          },
          "resultDigest": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "kind",
          "receiptId",
          "operationName",
          "operationId",
          "status",
          "changedResourceIds"
        ],
        "type": "object"
      },
      "PonderRunRelatedProblemDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "assignedPersonaId": {
            "nullable": true,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "problemId": {
            "type": "string"
          },
          "relationshipTypeId": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "kind",
          "problemId",
          "status"
        ],
        "type": "object"
      },
      "PonderRunRetryDiagnostic": {
        "additionalProperties": false,
        "description": "Something the Run tried again.",
        "properties": {
          "attempt": {
            "description": "The failed try this retry follows, counted from 1.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "delayMs": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "failureCode": {
            "description": "Application error code",
            "maxLength": 50,
            "nullable": true,
            "pattern": "^[A-Z_][A-Z0-9_]*$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "reason": {
            "description": "Why a structured answer's try failed; null for another target.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderRunDiagnosticRetryReasonEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "retryable": {
            "description": "False when that failed try was the last one allowed.",
            "type": "boolean"
          },
          "target": {
            "$ref": "#/components/schemas/PonderRunDiagnosticRetryTargetEnum"
          }
        },
        "required": [
          "kind",
          "target",
          "attempt",
          "retryable"
        ],
        "type": "object"
      },
      "PonderRunSegmentEndedDiagnostic": {
        "additionalProperties": false,
        "description": "One attempt of one durable Run step ended its turn segment.",
        "properties": {
          "attempt": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "duration": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "failureCode": {
            "description": "A FAILED outcome's code.",
            "maxLength": 50,
            "nullable": true,
            "pattern": "^[A-Z_][A-Z0-9_]*$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "limit": {
            "description": "The budget limit the segment reached, if it reached one.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderRunSegmentLimitEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "modelCalls": {
            "description": "The model calls the segment made.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "outcome": {
            "$ref": "#/components/schemas/PonderRunStepOutcomeKindEnum",
            "description": "The outcome the segment reports to the runner."
          },
          "rank": {
            "description": "The rank running when the segment ended.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "retryable": {
            "nullable": true,
            "type": "boolean"
          }
        },
        "required": [
          "kind",
          "attempt",
          "outcome",
          "modelCalls",
          "duration",
          "rank"
        ],
        "type": "object"
      },
      "PonderRunSegmentLimitEnum": {
        "description": "Which limit of its budget ended a turn segment.",
        "enum": [
          "model_calls",
          "wall_clock",
          "hard_abort"
        ],
        "type": "string"
      },
      "PonderRunSegmentStartedDiagnostic": {
        "additionalProperties": false,
        "description": "One attempt of one durable Run step started its turn segment.",
        "properties": {
          "attempt": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "rank": {
            "description": "The rank of the Persona's ranked models the segment starts with.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "resumed": {
            "description": "False when the segment prompts the triggering Message; true when it continues the Run's own journal.",
            "type": "boolean"
          }
        },
        "required": [
          "kind",
          "attempt",
          "rank",
          "resumed"
        ],
        "type": "object"
      },
      "PonderRunStepContext": {
        "description": "What one turn segment reads from web-api: the sealed dispatch snapshot\nexactly as acceptance persisted it, the Run as it is now, its approvals\nwith their decisions, and the Run's own pi journal. No step writes model or\nUI message state; the journal is the model context.",
        "properties": {
          "approvals": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRunApproval"
            },
            "maxItems": 512,
            "minItems": 0,
            "type": "array"
          },
          "dispatch": {
            "$ref": "#/components/schemas/ParableProblemRuntimeDispatchInput"
          },
          "forkedEntryCount": {
            "description": "How many of sessionEntries, from the first, are the fork of the\nProblem's journal web-api wrote when the Run started (PARABLE-4969):\nentries no segment attempt wrote. The entries after them are the Run's\nown, stored by its segments. 0 when the Problem had no journal to fork.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "nextSeq": {
            "description": "The first seq not yet stored for this step, so a retried attempt continues after what an earlier attempt streamed.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "run": {
            "$ref": "#/components/schemas/ParableProblemRun"
          },
          "sessionEntries": {
            "description": "The Run's pi journal in replay order: the session header, then every\nentry from the latest compaction's first kept entry on, the way a\nProblem's journal is loaded for a chat turn. Entries are pi's own format,\nwhich ponder-api restores unchanged. Empty before the Run's first segment\nflushed anything.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "maxItems": 200000,
            "minItems": 0,
            "type": "array"
          },
          "streamingMessageId": {
            "description": "The Run's assistant Message still streaming, which the segment keeps appending to; null before the first chunk batch.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "dispatch",
          "run",
          "approvals",
          "nextSeq",
          "sessionEntries",
          "forkedEntryCount"
        ],
        "type": "object"
      },
      "PonderRunStepFailure": {
        "additionalProperties": false,
        "description": "Why a segment failed. The code names something inside a successful step\nresponse, so it is a Parable.ErrorCode, the code a Run's error part carries.",
        "properties": {
          "code": {
            "description": "Application error code",
            "maxLength": 50,
            "pattern": "^[A-Z_][A-Z0-9_]*$",
            "type": "string"
          },
          "message": {
            "description": "Operator summary. It can quote model configuration, so the runner logs only its length, and drops it before the outcome enters history.",
            "maxLength": 1024,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "retryable": {
            "type": "boolean"
          }
        },
        "required": [
          "code",
          "retryable"
        ],
        "type": "object"
      },
      "PonderRunStepOutcome": {
        "additionalProperties": false,
        "description": "Activity output of `execute_step`; stored in orchestration history.",
        "properties": {
          "failure": {
            "description": "Present only for FAILED.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderRunStepFailure"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunStepOutcomeKindEnum"
          },
          "messageId": {
            "description": "The assistant Message the segment streamed into, when it opened one.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "wait": {
            "description": "Present only for APPROVAL_REQUIRED and PING_ASKED.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderRunWait"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "kind",
          "stepIndex"
        ],
        "type": "object"
      },
      "PonderRunStepOutcomeKindEnum": {
        "description": "Ponder Run step contracts (EDR-0092 spec 2.4, PARABLE-4965). These shapes\ncross three hops: ponder-runner (Rust) schedules `execute_step` with a\nPonderRunStepInput, ponder-api (TypeScript) answers with a\nPonderRunStepOutcome, and web-api (Go) records the transitions the runner\ndecides. A step is one pi turn segment (EDR-0092 amendment A1). Every field\nis an id, a digest, an enum, a timestamp or a small integer: no Message\ntext, prompt, journal entry, tool argument or provider payload belongs\nhere, because the outcome is stored in orchestration history and replayed\non every recovery.\nHow one turn segment ended, as ponder-api reports it to the runner.",
        "enum": [
          "continue",
          "completed",
          "approval_required",
          "ping_asked",
          "cancelled",
          "failed"
        ],
        "type": "string"
      },
      "PonderRunStepStatusEnum": {
        "description": "Durable Run state in web_db (EDR-0092 decision item 3, D2; PARABLE-4966).\nweb-db embeds these shapes, so they live here rather than in\nweb-shared-types, which web-db cannot depend on.\nLifecycle of one step ledger row: one attempt of one turn segment. A step\nindex with a COMPLETED row is finished, and a later call for it answers 409\nwith the stored outcome. FAILED is an attempt that ended without an outcome\nthe runner can act on, or one a later attempt superseded.",
        "enum": [
          "started",
          "completed",
          "failed"
        ],
        "type": "string"
      },
      "PonderRunStreamChunk": {
        "additionalProperties": false,
        "description": "One public stream part of a Run's answer, ordered by `seq` within its step.\n`part` is an AI SDK UI message chunk after Ponder's public projection, the\nsame shape the direct path streams over SSE: no tool arguments, credentials\nor provider metadata.",
        "properties": {
          "part": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "seq": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "seq",
          "part"
        ],
        "type": "object"
      },
      "PonderRunToolCallDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "approval": {
            "type": "string"
          },
          "argumentsDigest": {
            "type": "string"
          },
          "attemptCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "changedResourceIds": {
            "items": {
              "type": "string"
            },
            "maxItems": 100,
            "type": "array"
          },
          "durationMs": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "failureCode": {
            "nullable": true,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "operationId": {
            "type": "string"
          },
          "operationName": {
            "type": "string"
          },
          "receiptId": {
            "nullable": true,
            "type": "string"
          },
          "resultDigest": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "kind",
          "operationName",
          "operationId",
          "argumentsDigest",
          "approval",
          "status",
          "changedResourceIds"
        ],
        "type": "object"
      },
      "PonderRunToolDiscoveryDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "queryDigest": {
            "type": "string"
          },
          "registryDigest": {
            "type": "string"
          },
          "resultCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "resultNames": {
            "items": {
              "type": "string"
            },
            "maxItems": 100,
            "type": "array"
          }
        },
        "required": [
          "kind",
          "queryDigest",
          "resultCount",
          "resultNames",
          "registryDigest"
        ],
        "type": "object"
      },
      "PonderRunTransitionInput": {
        "additionalProperties": false,
        "description": "One orchestration-driven Run status transition (`recordPonderRunTransition`,\nEDR-0092 D6), the runner's only Run write. Idempotent on idempotencyKey.",
        "properties": {
          "code": {
            "description": "Why the runner failed or cancelled the Run; null for the live transitions.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderRunnerRunError"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/PonderRunTransitionStatusEnum"
          },
          "stepFailure": {
            "description": "The segment's own failure, when ponder-api reported one (code PONDER_STEP_FAILED).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderRunStepFailure"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "stepIndex": {
            "description": "The turn segment the transition follows.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "status",
          "stepIndex",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "PonderRunTransitionStatusEnum": {
        "description": "The Run status transitions the runner records through web-api\n(`recordPonderRunTransition`, EDR-0092 D6). TERMINAL closes the dispatch\nafter a COMPLETED outcome, whose Run status ponder-api has already settled\nthrough completeParableProblemRun.",
        "enum": [
          "running",
          "waiting_for_approval",
          "waiting_for_ping",
          "cancelling",
          "failed",
          "cancelled",
          "terminal"
        ],
        "type": "string"
      },
      "PonderRunUsageDiagnostic": {
        "additionalProperties": false,
        "properties": {
          "costMicros": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "currency": {
            "nullable": true,
            "type": "string"
          },
          "inputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunDiagnosticEventKindEnum"
          },
          "modelReleaseId": {
            "nullable": true,
            "type": "string"
          },
          "outputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "routeBindingId": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "kind",
          "inputTokens",
          "outputTokens"
        ],
        "type": "object"
      },
      "PonderRunWait": {
        "additionalProperties": false,
        "description": "The decision or answer a paused Run waits for, and when the wait expires.",
        "properties": {
          "deadlineAt": {
            "description": "When the wait expires (D4); the earlier of this and the Run's deadline applies.",
            "format": "date-time",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PonderRunWaitKindEnum"
          },
          "subjectIds": {
            "description": "The approval ids or Ping ids the Run waits on.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 64,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "kind",
          "subjectIds",
          "deadlineAt"
        ],
        "type": "object"
      },
      "PonderRunWaitKindEnum": {
        "description": "What a paused Run waits for.",
        "enum": [
          "approval",
          "ping"
        ],
        "type": "string"
      },
      "PonderRunnerRunError": {
        "description": "ponder-runner Run errors (EDR-0092, PARABLE-4965). The runner writes these\ncodes on its `ponder.ponder_runs` ledger rows, in the failure output of a\n`ponder_run` orchestration, and in the `code` of the\n`recordPonderRunTransition` callback. ponder-api never raises them. The\nrunner reads each code from the generated enum; no copy of a value exists in\nits source.",
        "enum": [
          "PR-RN-001",
          "PR-RN-002",
          "PR-RN-003",
          "PR-RN-004",
          "PR-RN-005",
          "PR-RN-006",
          "PR-RN-007",
          "PR-RN-008",
          "PR-RN-009",
          "PR-RN-010",
          "PR-RN-011",
          "PR-RN-012"
        ],
        "type": "string"
      },
      "PonderSteerRequest": {
        "additionalProperties": false,
        "description": "Words a person adds to their own running Ponder reply (Cmd+Enter). pi\ndelivers them after the reply's current tool calls and before its next model\ncall (its `steer()`); the reply keeps running and answers them. Only the\nperson whose Message the reply answers may steer it.",
        "properties": {
          "idempotencyKey": {
            "description": "One steer per key: a retried request is delivered once.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "text": {
            "description": "Markdown text",
            "maxLength": 100000,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "text",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "PonderSummarizeInput": {
        "properties": {
          "context": {
            "description": "What the thing is about, such as the first Message sent in a new Parable.",
            "maxLength": 20000,
            "minLength": 1,
            "type": "string"
          },
          "subject": {
            "$ref": "#/components/schemas/PonderSummarySubjectEnum"
          }
        },
        "required": [
          "context",
          "subject"
        ],
        "type": "object"
      },
      "PonderSummarizeResult": {
        "properties": {
          "description": {
            "description": "One sentence.",
            "type": "string"
          },
          "icon": {
            "description": "A Font Awesome icon from Parable's icon catalog.",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "model": {
            "description": "The text model that wrote it, as the provider reported it.",
            "type": "string"
          },
          "title": {
            "description": "Two to five words.",
            "type": "string"
          }
        },
        "required": [
          "title",
          "description",
          "icon",
          "model"
        ],
        "type": "object"
      },
      "PonderSummarizeSetting": {
        "description": "Whether Ponder keeps a Parable's name, description and icon up to date from the Messages sent while viewing it.",
        "properties": {
          "canChange": {
            "description": "Whether you can turn it on or off: you can edit this Parable.",
            "type": "boolean"
          },
          "enabled": {
            "description": "On: the first Message names a new Parable, and each later Message may rename it. A person's own edit to the name, description or icon turns it off.",
            "type": "boolean"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "rootRefId",
          "enabled",
          "canChange"
        ],
        "type": "object"
      },
      "PonderSummarySubjectEnum": {
        "description": "What summarize is naming.",
        "enum": [
          "parable"
        ],
        "type": "string"
      },
      "PonderToolApprovalPolicyMemoryResult": {
        "description": "Browser-safe result; generated handles and private arguments remain server-owned.",
        "properties": {
          "approvalId": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "policy": {
            "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum"
          },
          "scope": {
            "$ref": "#/components/schemas/PonderToolPolicyRememberScopeEnum"
          },
          "workspacePolicyRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "approvalId",
          "scope",
          "policy",
          "workspacePolicyRevision"
        ],
        "type": "object"
      },
      "PonderToolPolicyMutationResult": {
        "properties": {
          "policy": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "toolHandle": {
            "type": "string"
          },
          "workspacePolicyRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "toolHandle",
          "workspacePolicyRevision"
        ],
        "type": "object"
      },
      "PonderToolPolicyRememberScopeEnum": {
        "description": "Scope used when a person remembers an inline tool decision; only the Workspace default remains.",
        "enum": [
          "workspace_default"
        ],
        "type": "string"
      },
      "PonderToolPolicySourceEnum": {
        "description": "Most-specific source that produced an effective tool policy.",
        "enum": [
          "operation_default",
          "workspace_default"
        ],
        "type": "string"
      },
      "PonderViewport": {
        "additionalProperties": false,
        "description": "A person's window, in CSS pixels, when a preview should be drawn at the size they are looking at.",
        "properties": {
          "colorScheme": {
            "description": "The rendered mode, including when the reader follows their system theme.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderColorSchemeEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "height": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 8192,
            "minimum": 120,
            "type": "integer"
          },
          "width": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 8192,
            "minimum": 120,
            "type": "integer"
          }
        },
        "required": [
          "width",
          "height"
        ],
        "type": "object"
      },
      "PonderWorkspaceActorSearchItemView": {
        "properties": {
          "actor": {
            "$ref": "#/components/schemas/ParableActorSnapshotView"
          },
          "hasProblemAccess": {
            "type": "boolean"
          },
          "mentionRequiresConfirmation": {
            "type": "boolean"
          }
        },
        "required": [
          "actor",
          "hasProblemAccess",
          "mentionRequiresConfirmation"
        ],
        "type": "object"
      },
      "PonderWorkspaceActorSearchPageView": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PonderWorkspaceActorSearchItemView"
            },
            "minItems": 0,
            "type": "array"
          },
          "nextCursor": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "PoolTableDescription": {
        "description": "One table of the catalog, as the Query Layer describes it: its fields with\ntheir Arrow types and Parable scalars, its primary key and relationships,\nand what is known of its rows and freshness. A value no measurement has\nproduced is null, which means unknown, not healthy.",
        "properties": {
          "catalogVersion": {
            "description": "The catalog the description was read from. It changes when a table or a\ncolumn is added, removed or retyped, not when data moves.",
            "type": "string"
          },
          "table": {
            "$ref": "#/components/schemas/SemanticCatalogTable"
          }
        },
        "required": [
          "catalogVersion",
          "table"
        ],
        "type": "object"
      },
      "PossibilityArgumentPolarityEnum": {
        "enum": [
          "pro",
          "con"
        ],
        "type": "string"
      },
      "PreEncodedBasicAuthConfig": {
        "description": "Configuration for pre-encoded HTTP basic authentication.\nUses an already-encoded Base64 token instead of username:password.",
        "properties": {
          "tokenField": {
            "description": "Credential field name for the pre-encoded Base64 token",
            "type": "string"
          }
        },
        "required": [
          "tokenField"
        ],
        "type": "object"
      },
      "PrepareArtifactUploadInput": {
        "additionalProperties": false,
        "properties": {
          "attributedConnectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "contentType": {
            "type": "string"
          },
          "fileName": {
            "type": "string"
          },
          "fileSize": {
            "description": "File size in bytes (non-negative, BIGINT-backed)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "path": {
            "description": "Hierarchical path expressed as a dot-separated ltree (e.g., 'reports.q1.draft').",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$",
            "type": "string"
          },
          "requestId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "requestId",
          "fileName",
          "fileSize",
          "contentType"
        ],
        "type": "object"
      },
      "PrepareArtifactUploadResult": {
        "properties": {
          "artifact": {
            "$ref": "#/components/schemas/ArtifactInfo"
          },
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "requiredHeaders": {
            "items": {
              "$ref": "#/components/schemas/ArtifactUploadHeader"
            },
            "type": "array"
          },
          "uploadUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "required": [
          "artifact",
          "uploadUrl",
          "requiredHeaders",
          "expiresAt"
        ],
        "type": "object"
      },
      "PrepareParableFindingChoiceInput": {
        "properties": {
          "choice": {
            "$ref": "#/components/schemas/ParableConflictChoiceEnum"
          },
          "findingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "findingId",
          "choice"
        ],
        "type": "object"
      },
      "PrepareParableProposalInput": {
        "properties": {
          "choices": {
            "description": "An empty list is the ORDINARY Prepare: a proposal with no conflicts has\nnothing to choose, and every Prepare with a clean merge sends `[]`\n(PARABLE-3549). `listMin: 0` says so out loud, because the Go emitter reads\na required array of length 0 as MISSING and answered 400 WA-VL-001 to every\none of them, which took the Workspace Prepare route offline.\n\nPARABLE-3258 is the generator-level root cause -- required should mean\nPRESENT, not non-empty, which is what the generated TypeScript and Rust\nvalidators already do. This declaration stays correct once that lands and\nsimply becomes redundant.",
            "items": {
              "$ref": "#/components/schemas/PrepareParableFindingChoiceInput"
            },
            "minItems": 0,
            "type": "array"
          },
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedFreshnessFingerprint": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "expectedReviewHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "idempotencyKey",
          "expectedAggregateRevision",
          "expectedReviewHash",
          "choices"
        ],
        "type": "object"
      },
      "PrepareParableProposalResult": {
        "properties": {
          "delivery": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableDeliverySummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "prepare": {
            "$ref": "#/components/schemas/ParablePrepareView"
          },
          "proposal": {
            "$ref": "#/components/schemas/ParableProposalRecordView"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          }
        },
        "required": [
          "receipt",
          "prepare",
          "proposal"
        ],
        "type": "object"
      },
      "PreviewParableProblemMessagePaneInput": {
        "additionalProperties": false,
        "description": "Which Parable and Pane to draw. Identifiers stay strings so a malformed one\nfrom the model is answered with a recoverable status rather than refused.",
        "properties": {
          "commitId": {
            "nullable": true,
            "type": "string"
          },
          "paneKey": {
            "nullable": true,
            "type": "string"
          },
          "reading": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlotDataReading"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "refId": {
            "nullable": true,
            "type": "string"
          },
          "rootRefId": {
            "nullable": true,
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableProblemMessageToolScope"
          }
        },
        "required": [
          "scope"
        ],
        "type": "object"
      },
      "PreviewParableProblemMessagePaneResult": {
        "properties": {
          "diagnostics": {
            "description": "NOT_BUILT only: each error that stopped the requested Pane from compiling,\nwith its line and column in the Pane's source, so the caller can fix it\nwith edit_piece_source. Empty for every other status.",
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintDiagnostic"
            },
            "type": "array"
          },
          "paneKey": {
            "nullable": true,
            "type": "string"
          },
          "panes": {
            "description": "Every Pane in the Parable, so a wrong name is answered with the choices.",
            "items": {
              "$ref": "#/components/schemas/ParableProblemMessagePaneSummary"
            },
            "maxItems": 1000,
            "minItems": 0,
            "type": "array"
          },
          "payload": {
            "description": "The compiled modules plus the declarations the renderer needs, sent whole.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePanePreviewInjection"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "recovery": {
            "nullable": true,
            "type": "string"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemMessagePanePreviewStatusEnum"
          },
          "title": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "status",
          "panes",
          "diagnostics"
        ],
        "type": "object"
      },
      "PreviewParableProblemRunPaneInput": {
        "additionalProperties": false,
        "description": "A durable Run asking for a Pane preview, drawn for the person who started\nthe Run. The target fields mean what PreviewParableProblemMessagePaneInput's\ndo, with the Run's accepted context in place of a Message's. The answer is\nPreviewParableProblemMessagePaneResult.",
        "properties": {
          "commitId": {
            "nullable": true,
            "type": "string"
          },
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "paneKey": {
            "nullable": true,
            "type": "string"
          },
          "reading": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlotDataReading"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "refId": {
            "nullable": true,
            "type": "string"
          },
          "rootRefId": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "dispatchSnapshotDigest"
        ],
        "type": "object"
      },
      "PreviewProviderPolicyInput": {
        "description": "A proposed Provider Policy for one table, checked and not saved.",
        "properties": {
          "count": {
            "description": "Also count the rows each rule and Everyone else would read. Counting\nreads the table once; checking alone reads no row.",
            "type": "boolean"
          },
          "definition": {
            "$ref": "#/components/schemas/ProviderPolicyDefinition"
          }
        },
        "required": [
          "definition",
          "count"
        ],
        "type": "object"
      },
      "PreviewSourcePermissionsInput": {
        "additionalProperties": false,
        "description": "Asks what one person would read from each table source permissions model.",
        "properties": {
          "email": {
            "description": "The email the person signs in with.",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "PriorMessageCausationRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ProblemMessageCausationKindEnum"
          },
          "messageId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "messageId"
        ],
        "type": "object"
      },
      "ProblemMessageCausationKindEnum": {
        "enum": [
          "run",
          "tool_call",
          "approval",
          "message",
          "fact"
        ],
        "type": "string"
      },
      "ProblemPingAudienceEnum": {
        "enum": [
          "consult",
          "inform"
        ],
        "type": "string"
      },
      "ProblemPingPurpose": {
        "description": "Authored Consult or Inform purpose for a durable Ping.",
        "discriminator": {
          "mapping": {
            "consult": "#/components/schemas/ConsultProblemPingPurpose",
            "inform": "#/components/schemas/InformProblemPingPurpose"
          },
          "propertyName": "audience"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ConsultProblemPingPurpose"
          },
          {
            "$ref": "#/components/schemas/InformProblemPingPurpose"
          }
        ]
      },
      "ProblemPingPurposeInput": {
        "description": "Consult or Inform intent for one directed Problem Ping.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/ConsultProblemPingPurposeInput"
          },
          {
            "$ref": "#/components/schemas/InformProblemPingPurposeInput"
          }
        ]
      },
      "ProblemPingQuestionModalityEnum": {
        "description": "How one Consult question is answered. Every modality stores the same shape —\nordered Possibility selections, each carrying an optional note — so adding a\nmodality never invalidates an answer already given under another one.",
        "enum": [
          "single_select",
          "multi_select",
          "ranked_choice"
        ],
        "type": "string"
      },
      "ProblemRunCancellation": {
        "properties": {
          "reason": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "requestedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "requestedBy": {
            "$ref": "#/components/schemas/ParableActorRef"
          }
        },
        "required": [
          "requestedBy",
          "reason",
          "requestedAt"
        ],
        "type": "object"
      },
      "ProblemRunDecisionDeliveryStatusEnum": {
        "enum": [
          "not_required",
          "pending",
          "claimed",
          "delivered",
          "abandoned"
        ],
        "type": "string"
      },
      "ProblemRunDecisionEnum": {
        "enum": [
          "approved",
          "denied",
          "cancelled"
        ],
        "type": "string"
      },
      "ProblemRunDecisionStateEnum": {
        "description": "Lifecycle of one approval request. `expired` is the platform closing a\nrequest nobody decided before the Run's deadline (EDR-0092 D4): the Run has\nalready failed with PONDER_APPROVAL_DEADLINE or PONDER_PING_DEADLINE,\n`decision` stays null, and nothing is delivered to the runner.",
        "enum": [
          "pending",
          "decided",
          "expired"
        ],
        "type": "string"
      },
      "ProcessorModelChoice": {
        "additionalProperties": false,
        "description": "A model named by the processor that serves it, in that processor's own\nmodel id: `anthropic/claude-haiku-5-5` on OPENROUTER_ZDR, or `gemini-3.5-flash-lite` on\nVERTEX. The platform defaults use it because a catalog Model Release id\ndiffers between environments.",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ModelChoiceKind"
          },
          "modelId": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "processor": {
            "$ref": "#/components/schemas/ModelProcessor"
          }
        },
        "required": [
          "kind",
          "processor",
          "modelId"
        ],
        "type": "object"
      },
      "ProductParableActionAvailabilityView": {
        "description": "One action on a Parable, and whether the reader may run it here.\nPARABLE-1469 criterion 13: anything unavailable renders in a visible disabled\nstate with a tooltip saying why. A list of the actions that happen to be\nallowed cannot express that -- a dropped action and an action that was never\noffered look identical to the surface rendering it. So the contract carries\nevery action the state knows about, each one saying whether it is enabled\nand, when it is not, the sentence to show the reader.\nThe two carve-outs where an action IS absent rather than disabled: the Pocket\n(Pocketed things leave default views but stay findable) and no RACI at all\n(the Parable is omitted entirely -- security omission, not feature hiding).",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/ProductParableActionEnum"
          },
          "enabled": {
            "type": "boolean"
          },
          "precedence": {
            "description": "Rank among the actions offered here; the highest enabled entry is the\nprimary button.\nNullable only while the web-app still computes availability in its own read\nmodel. The server fills it from ActionContract; that local path and this\nnull go away together in Stage 6 (PARABLE-1773).\nThis replaces something that was not previously a decision: the primary\nbutton was the first enabled entry of a hardcoded array in the frontend, so\nreordering that array silently changed which control a customer reached\nfor, and no test or schema recorded the intended order.",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "reason": {
            "description": "Why the action cannot run, in words an intern and a CEO both understand.\nNull exactly when `enabled` is true -- an enabled action has nothing to\nexplain.",
            "nullable": true,
            "type": "string"
          },
          "reversible": {
            "description": "Whether running this action can be undone by a later action in the\ncontract. Revoke is reversible -- a successor publish widens the audience\nagain -- and so is Retract: it blocks only NEW Deliveries and Pulls, while\nevery Deployment already running that Commit keeps running it. Publish and\nDelete are the irreversible pair, which is why they sit at Accountable.",
            "nullable": true,
            "type": "boolean"
          },
          "surface": {
            "description": "Which surface may run this action at all, independent of the reader's role\nand the Proposal's state.\nCarried on the wire because ADMIN is the whole of why a Workspace can never\nDeploy, and a surface that only learns \"disabled\" cannot say which of the\nthree gates refused.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableActionSurfaceEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "target": {
            "description": "What this row's action acts on.\nCarried because the contract is keyed on the PAIR (PARABLE-1802), not on\nthe action alone: Pocket and Restore each name a Proposal, a Deployment and\na ProductParable, and the three carry different seats. Without the target,\nthree Pocket rows reach a renderer as three copies of one action and it\npicks whichever it met first -- which is the same class of thing as the\nhardcoded array the `precedence` field below replaced.\nNullable only while the web-app still computes availability in its own read\nmodel; that local path and this null go away together in Stage 6\n(PARABLE-1773).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableActionTargetEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "required": [
          "action",
          "enabled"
        ],
        "type": "object"
      },
      "ProductParableActionEnum": {
        "description": "Every act a caller can ask of a Parable.\nThis replaces `ParablePublishActionEnum`, which named ten of these and called\nthe set \"publish actions\" while already carrying Pull and Retry, neither of\nwhich publishes anything. The set now covers governance (Delegate) and\nreach (Deploy, Revoke, Retract) too, so the old name described a third of its\nown members.\nThe grouping comments below are documentation and nothing more. An `axis`\nfield used to state them; it gated nothing (authorization is `requires` AND\n`from` AND `surface`), it was derivable from `target` for almost every member,\nand where it was not derivable it was ambiguous -- Pull consumes a Delivery\nbut opens a Proposal, so forcing it to pick a side lost the only interesting\nthing about it. See PARABLE-1469, \"Why axis was dropped\".\nMember names are the contract's vocabulary, not the rendered label. POCKET\nrenders as \"Pocket\", OPEN renders as \"Create Draft\" (PARABLE-1773, Stage 6).\nThat separation already existed: the shipped enum's ARCHIVE member carried the\nPocket copy and DISCARD carried the Delete copy.\nOPEN is the member, \"Create Draft\" is the screen. Settled by the owner on\n2026-08-08. PARABLE-1469's prose calls the name an open decision, but its own\nmember list and its Responsible grant list both already say Open, and\nResponsible's description already reads \"start ... a Proposal\" -- so the prose\nis stale relative to the model beside it. Keeping the identifier as Open is\nthe same split this repo already runs for tenant/Workspace: identifiers keep\nthe internal word, screens carry the customer's. It also keeps a third noun\noff an object that already answers to Proposal.",
        "enum": [
          "open",
          "patch",
          "ping",
          "propose",
          "prepare",
          "publish",
          "pocket",
          "restore",
          "delete",
          "preview",
          "plot",
          "prove",
          "plan",
          "cancel_report",
          "raise_report_budget",
          "preference",
          "delegate",
          "pull",
          "retry",
          "deploy",
          "revoke",
          "retract"
        ],
        "type": "string"
      },
      "ProposeParableProposalInput": {
        "properties": {
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedRefVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "message": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "expectedRefVersion",
          "expectedAggregateRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ProviderAggregationEnum": {
        "description": "How the members of an iterated operation combine into its outcome\n(PARABLE-4930).",
        "enum": [
          "all_success",
          "any_success"
        ],
        "type": "string"
      },
      "ProviderBudgetChargeEnum": {
        "enum": [
          "outer_request",
          "batch_member"
        ],
        "type": "string"
      },
      "ProviderBudgetClaimSpec": {
        "properties": {
          "budgetId": {
            "minLength": 1,
            "type": "string"
          },
          "charge": {
            "$ref": "#/components/schemas/ProviderBudgetChargeEnum"
          },
          "cost": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "budgetId",
          "cost",
          "charge"
        ],
        "type": "object"
      },
      "ProviderBudgetDefinition": {
        "properties": {
          "apiFamily": {
            "minLength": 1,
            "type": "string"
          },
          "id": {
            "minLength": 1,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ProviderBudgetKindEnum"
          },
          "limit": {
            "description": "Starting allowance for adaptive budgets; a ceiling for fixed budgets.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "observation": {
            "description": "With observation, limit/windowSeconds bounds pace, not provider entitlement.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProviderBudgetWindowObservation"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "scope": {
            "items": {
              "$ref": "#/components/schemas/ProviderBudgetScopeEnum"
            },
            "minItems": 1,
            "type": "array"
          },
          "windowSeconds": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "apiFamily",
          "kind",
          "scope",
          "limit"
        ],
        "type": "object"
      },
      "ProviderBudgetFeedbackRule": {
        "additionalProperties": false,
        "properties": {
          "bodyReason": {
            "description": "Case-sensitive substring of a top-level error field in a JSON body: a\nstring `error`, a string `message`, an `error` object's `message`,\n`status`, or any `errors[].reason`, or a `message` object's `error`.\nRecord content never matches. Null matches on status and headers alone.",
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "budgetId": {
            "description": "Null means the response does not identify which claim was refused; it then\nthrottles only the request's narrowest claimed budgets, the same as a 429\nthat no rule matches. So does a rule naming a budget the request does not\nclaim, without that budget's delay.",
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "fallbackCooldownSeconds": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "headerMatches": {
            "description": "All must match. A missing header never matches.",
            "items": {
              "$ref": "#/components/schemas/ProviderBudgetHeaderCondition"
            },
            "minItems": 1,
            "nullable": true,
            "type": "array"
          },
          "resetHeader": {
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          },
          "resetHeaderCondition": {
            "description": "Only the reset-header delay depends on this condition; Retry-After still wins.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProviderBudgetHeaderCondition"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "statusCode": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "statusCode"
        ],
        "type": "object"
      },
      "ProviderBudgetHeaderCondition": {
        "additionalProperties": false,
        "properties": {
          "equals": {
            "pattern": "^\\S(.*\\S)?$",
            "type": "string"
          },
          "header": {
            "maxLength": 255,
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          }
        },
        "required": [
          "header",
          "equals"
        ],
        "type": "object"
      },
      "ProviderBudgetKindEnum": {
        "enum": [
          "token_bucket",
          "paced_window",
          "adaptive_paced_window",
          "adaptive_concurrent",
          "concurrent"
        ],
        "type": "string"
      },
      "ProviderBudgetOperation": {
        "properties": {
          "claims": {
            "description": "The request's shape comes from the transport option that names this\noperation (providerBudgetOperation) or from the credential exchange whose\npolicy declares it.",
            "items": {
              "$ref": "#/components/schemas/ProviderBudgetClaimSpec"
            },
            "minItems": 1,
            "type": "array"
          },
          "id": {
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "id",
          "claims"
        ],
        "type": "object"
      },
      "ProviderBudgetPolicy": {
        "properties": {
          "budgets": {
            "items": {
              "$ref": "#/components/schemas/ProviderBudgetDefinition"
            },
            "minItems": 1,
            "type": "array"
          },
          "feedback": {
            "items": {
              "$ref": "#/components/schemas/ProviderBudgetFeedbackRule"
            },
            "nullable": true,
            "type": "array"
          },
          "operations": {
            "items": {
              "$ref": "#/components/schemas/ProviderBudgetOperation"
            },
            "minItems": 1,
            "type": "array"
          },
          "quotaOwner": {
            "$ref": "#/components/schemas/ProviderQuotaOwnerSelector"
          }
        },
        "required": [
          "quotaOwner",
          "budgets",
          "operations"
        ],
        "type": "object"
      },
      "ProviderBudgetScopeEnum": {
        "enum": [
          "quota_owner",
          "delegated_subject"
        ],
        "type": "string"
      },
      "ProviderBudgetWindowObservation": {
        "properties": {
          "fallbackLimit": {
            "description": "Native units per budget window while the provider allowance is unknown.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "limitHeader": {
            "maxLength": 255,
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          },
          "remainingHeader": {
            "maxLength": 255,
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          },
          "resetEpochSecondsHeader": {
            "maxLength": 255,
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          },
          "resourceHeader": {
            "description": "resourceHeader and resourceValue are declared together or not at all.",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          },
          "resourceValue": {
            "nullable": true,
            "pattern": "^\\S(.*\\S)?$",
            "type": "string"
          }
        },
        "required": [
          "remainingHeader",
          "limitHeader",
          "resetEpochSecondsHeader",
          "fallbackLimit"
        ],
        "type": "object"
      },
      "ProviderCatalogAnnotationEntry": {
        "properties": {
          "computedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "health": {
            "description": "Deploy query-layer consumers before web-api producers when adding\nTransformationDatasetHealthState values; generated enum decoding is strict.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TransformationDatasetHealthState"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "healthReason": {
            "nullable": true,
            "type": "string"
          },
          "materialized": {
            "nullable": true,
            "type": "boolean"
          },
          "statsRowCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "tenantConnectorTapId": {
            "description": "Null for the synthetic providers.identity family, which is derived from\nmultiple configured input taps rather than owned by one tenant tap.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "validationRates": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ValidationRateAnnotation"
            },
            "type": "object"
          },
          "watermark": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "watermarkStale": {
            "nullable": true,
            "type": "boolean"
          }
        },
        "required": [
          "validationRates"
        ],
        "type": "object"
      },
      "ProviderCatalogAnnotationsResponse": {
        "properties": {
          "entries": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ProviderCatalogAnnotationEntry"
            },
            "type": "object"
          }
        },
        "required": [
          "entries"
        ],
        "type": "object"
      },
      "ProviderDirectoryEntry": {
        "description": "A visible product in the directory. The grouping identifies its configuration route.\nCredentials, authentication schemas, and setup documentation are loaded on demand.",
        "properties": {
          "connectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "groupingIds": {
            "description": "Visible configuration variants for this product, including authentication alternatives.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "groupingPath": {
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "logo": {
            "description": "Transparent PNG logo image",
            "nullable": true,
            "type": "object"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "priority": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorPriorityEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "releaseStage": {
            "$ref": "#/components/schemas/ParableReleaseStageEnum"
          },
          "vendor": {
            "$ref": "#/components/schemas/ParableVendor",
            "description": "Company reference. Its groupings array is empty in this response."
          }
        },
        "required": [
          "id",
          "connectorId",
          "groupingIds",
          "name",
          "releaseStage",
          "groupingPath",
          "vendor"
        ],
        "type": "object"
      },
      "ProviderExtract": {
        "description": "A value an operation reads from its response once a success rule matches\n(PARABLE-4929). A workflow writeback can store it in the connection's\ningestion config. A secret value never enters a URL, a log, a result\ndetail, or a writeback.",
        "properties": {
          "name": {
            "description": "Unique within its operation; a writeback names it with the operation id.",
            "type": "string"
          },
          "secret": {
            "description": "Whether the value is secret. Absent means secret: only an extract that\ndeclares `secret: false` may be written back.",
            "nullable": true,
            "type": "boolean"
          },
          "source": {
            "$ref": "#/components/schemas/ProviderValueRef",
            "description": "The response value: `status`, `headers.\u003cname\u003e`, or `body.\u003cdotted path\u003e`."
          },
          "type": {
            "$ref": "#/components/schemas/ProviderExtractTypeEnum",
            "description": "The JSON type the value must have; a value of another type, a value the\nbounded read cannot reach, or a value over 2048 bytes is not extracted."
          }
        },
        "required": [
          "name",
          "source",
          "type"
        ],
        "type": "object"
      },
      "ProviderExtractTypeEnum": {
        "description": "The JSON type an extract requires of the value it reads. A value of another\ntype is not extracted.",
        "enum": [
          "string",
          "number",
          "boolean"
        ],
        "type": "string"
      },
      "ProviderInvocation": {
        "description": "Runs an operation once per member of a list, a bounded number of times\n(PARABLE-4930). Each member is one request, counted against the workflow's\nrequest budget; the request reads the member as `${item.\u003citemName\u003e}`.",
        "properties": {
          "aggregation": {
            "description": "How member outcomes combine into the operation's outcome. Defaults to\nall_success.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProviderAggregationEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "forEach": {
            "$ref": "#/components/schemas/ProviderValueRef",
            "description": "The list to iterate: an `ingestion` field declared as a list of strings\nor numbers."
          },
          "itemName": {
            "description": "The name the request uses for the current member.",
            "type": "string"
          },
          "maxItems": {
            "description": "Most members to run, from the start of the list. Required: an iteration\nwithout a bound is refused.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "forEach",
          "itemName"
        ],
        "type": "object"
      },
      "ProviderOperation": {
        "description": "One request and the rules that judge its response.",
        "properties": {
          "extracts": {
            "description": "Values read from the response when the operation succeeds.",
            "items": {
              "$ref": "#/components/schemas/ProviderExtract"
            },
            "nullable": true,
            "type": "array"
          },
          "id": {
            "description": "Unique within its workflow. Named in results and admission errors, and in\n`${step.\u003cid\u003e.\u003cextract\u003e}` references from later operations.",
            "type": "string"
          },
          "invocation": {
            "description": "Runs the operation once per member of a list. Absent: one request.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProviderInvocation"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "outcomes": {
            "description": "Ordered outcome rules; the first rule whose predicates all hold decides.",
            "items": {
              "$ref": "#/components/schemas/ProviderOutcomeRule"
            },
            "type": "array"
          },
          "request": {
            "$ref": "#/components/schemas/ProviderRequestTemplate",
            "description": "The request to send."
          }
        },
        "required": [
          "id",
          "request",
          "outcomes"
        ],
        "type": "object"
      },
      "ProviderOutcomeEnum": {
        "description": "Vocabulary of a declarative provider operation: one bounded request to a\nprovider and the ordered rules that turn its response into an outcome\n(PARABLE-4273). Credential validation is the first consumer; each consumer\nmaps an outcome to its own verdict.\nWhat a matched outcome rule says about the request.",
        "enum": [
          "success",
          "expected_empty",
          "retry",
          "auth_rejected",
          "permission_denied",
          "config_invalid",
          "upstream_failure"
        ],
        "type": "string"
      },
      "ProviderOutcomeRule": {
        "description": "An outcome that applies when every predicate holds. Rules are tried in\norder and the first match wins; a predicate the response cannot decide (a\nbody read only in part) never holds.",
        "properties": {
          "all": {
            "description": "Conditions that must all hold.",
            "items": {
              "$ref": "#/components/schemas/ProviderPredicate"
            },
            "type": "array"
          },
          "outcome": {
            "$ref": "#/components/schemas/ProviderOutcomeEnum",
            "description": "What a match means."
          },
          "reason": {
            "description": "Why, in words a reader of the result can act on.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "all",
          "outcome"
        ],
        "type": "object"
      },
      "ProviderPolicyAccess": {
        "description": "What a Provider Policy lets a reader read from one Provider table\n(PARABLE-5432). A rule binds Workspace roles to one access; Everyone else is\nthe access for readers none of whose roles a rule names. A reader whose\nroles several rules name gets the union of those rules. Parable filter\nPolicies (PARABLE-5423) use the first three only.",
        "enum": [
          "all_rows",
          "rows_where",
          "hidden",
          "source_permissions"
        ],
        "type": "string"
      },
      "ProviderPolicyAccessRule": {
        "additionalProperties": false,
        "description": "The access for readers none of whose roles a rule names. `conditions` are\nSQL conditions over the table's own columns, ANDed together. ROWS_WHERE\nneeds at least one, SOURCE_PERMISSIONS may have some, which AND with source\npermissions, and ALL_ROWS and HIDDEN have none.",
        "properties": {
          "access": {
            "$ref": "#/components/schemas/ProviderPolicyAccess"
          },
          "conditions": {
            "items": {
              "description": "SQL text",
              "minLength": 1,
              "pattern": "^[\\s\\S]*$",
              "type": "string"
            },
            "maxItems": 100,
            "type": "array"
          }
        },
        "required": [
          "access",
          "conditions"
        ],
        "type": "object"
      },
      "ProviderPolicyAudienceRows": {
        "description": "The rows one audience of a proposed Provider Policy reads: a rule, or\nEveryone else when `ruleKey` is null.",
        "properties": {
          "readsReader": {
            "description": "The audience's rows differ from person to person, so `rows` is not\ncounted (0): its conditions read who is reading, or it reads\nSOURCE_PERMISSIONS.",
            "type": "boolean"
          },
          "rows": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "ruleKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "readsReader",
          "rows"
        ],
        "type": "object"
      },
      "ProviderPolicyCheckResponse": {
        "properties": {
          "columns": {
            "description": "The columns the conditions name, in the table's column order.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "counts": {
            "description": "Present when the request asked for counts and every condition compiled.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProviderPolicyRowCounts"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "logicalName": {
            "nullable": true,
            "type": "string"
          },
          "modeled": {
            "description": "Whether the table is modeled, as ProviderPolicyTable says. web-api\nrefuses a SOURCE_PERMISSIONS rule on a table that is not.",
            "type": "boolean"
          },
          "problems": {
            "items": {
              "$ref": "#/components/schemas/ProviderPolicyProblem"
            },
            "type": "array"
          },
          "readsReader": {
            "description": "Whether a condition reads who is reading (request_principal()), so the\nrows it keeps depend on the reader.",
            "type": "boolean"
          },
          "schemaName": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "served": {
            "description": "Whether the Workspace's catalog serves this table. A table it does not\nserve is not checked, and its names are null.",
            "type": "boolean"
          }
        },
        "required": [
          "served",
          "problems",
          "columns",
          "readsReader",
          "modeled"
        ],
        "type": "object"
      },
      "ProviderPolicyColumn": {
        "description": "One column of a Provider table, as the catalog serves it, with the\nprimitive a condition compares it as.",
        "properties": {
          "field": {
            "$ref": "#/components/schemas/SemanticCatalogField"
          },
          "primitive": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProviderPolicyColumnPrimitive"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "required": [
          "field"
        ],
        "type": "object"
      },
      "ProviderPolicyColumnPrimitive": {
        "description": "The psgen primitive a condition compares a column as, so a condition editor\nwrites its literals right: quoted text for String, a number for Int and\nFloat, true or false for Bool. A column of any other Arrow type (a date, a\ntimestamp, a list, a struct) has none.",
        "enum": [
          "String",
          "Int",
          "Float",
          "Bool"
        ],
        "type": "string"
      },
      "ProviderPolicyDefinition": {
        "additionalProperties": false,
        "description": "A Provider Policy: which rows of one Provider table the people in each role\nread, in every read of the Workspace (PARABLE-5432). A reader gets the union\nof every rule that names one of their roles; a reader no rule names gets\n`everyoneElse`. Whole-table limits the field validators cannot state (a role\nin at most one rule, at most 100 conditions and 60 KiB of condition text\nper table) are held by web-db's provider_policy_definition_is_valid.",
        "properties": {
          "everyoneElse": {
            "$ref": "#/components/schemas/ProviderPolicyAccessRule"
          },
          "rules": {
            "items": {
              "$ref": "#/components/schemas/ProviderPolicyRule"
            },
            "maxItems": 50,
            "type": "array"
          }
        },
        "required": [
          "rules",
          "everyoneElse"
        ],
        "type": "object"
      },
      "ProviderPolicyProblem": {
        "description": "Why a Provider Policy cannot apply as written. `ruleKey` names the rule, or\nis null for Everyone else; `condition` is the condition's position in that\nrule, from 0. The message names the column or the construct the Query Layer\nrefused; it never quotes a row value.",
        "properties": {
          "condition": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "message": {
            "type": "string"
          },
          "ruleKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "condition",
          "message"
        ],
        "type": "object"
      },
      "ProviderPolicyRecord": {
        "description": "A table's stored Provider Policy.",
        "properties": {
          "definition": {
            "$ref": "#/components/schemas/ProviderPolicyDefinition"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "description": "The compare-and-swap token: a save names it as expectedRevision.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "definition",
          "revision",
          "updatedAt",
          "updatedBy"
        ],
        "type": "object"
      },
      "ProviderPolicyRole": {
        "description": "A Workspace's Provider Policies as its administrators see them\n(PARABLE-5432): which rows of each Provider table the people in each\nWorkspace role read, in every read of the Workspace.\nA role a Provider Policy rule can bind, or one a stored rule still names.",
        "properties": {
          "allDataAccess": {
            "description": "The role is not removed and its own permissions cover All data access\n(`tenant.data.unrestricted`, EDR-0095 D7), by the prefix rule web-api\napplies to a reader's roles. Workspace Administrator covers it through\nbare `tenant`. Another role covers it only when it is given it. Its\nholders read every row of every Provider table on the reads they make\nthemselves, whatever a rule says. Only a View as preview of a holder\napplies a rule that names the role. Found by permission, never by name.",
            "type": "boolean"
          },
          "assignable": {
            "description": "Whether a rule may bind the role now: it exists and every permission it\nholds is a Workspace permission, the rule Workspace role assignment uses.",
            "type": "boolean"
          },
          "holders": {
            "description": "Active members of this Workspace who hold the role.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "removed": {
            "description": "The role was removed. A rule that names it binds nobody.",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "name",
          "holders",
          "assignable",
          "removed",
          "allDataAccess"
        ],
        "type": "object"
      },
      "ProviderPolicyRowCounts": {
        "description": "What a proposed Provider Policy keeps, counted over the table's current\nrows.",
        "properties": {
          "audiences": {
            "items": {
              "$ref": "#/components/schemas/ProviderPolicyAudienceRows"
            },
            "type": "array"
          },
          "total": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "total",
          "audiences"
        ],
        "type": "object"
      },
      "ProviderPolicyRule": {
        "additionalProperties": false,
        "description": "One rule of a Provider Policy: the Workspace roles it binds and what they\nread. `key` stays the same across saves. A role appears in at most one rule\nof a table. `conditions` follow the same rule as for Everyone else.",
        "properties": {
          "access": {
            "$ref": "#/components/schemas/ProviderPolicyAccess"
          },
          "conditions": {
            "items": {
              "description": "SQL text",
              "minLength": 1,
              "pattern": "^[\\s\\S]*$",
              "type": "string"
            },
            "maxItems": 100,
            "type": "array"
          },
          "key": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "roleIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "key",
          "roleIds",
          "access",
          "conditions"
        ],
        "type": "object"
      },
      "ProviderPoolIdentityImpactEnum": {
        "description": "What a layout change does to identity resolution's input from the tap's\nroot table.",
        "enum": [
          "IDENTITY_UNCHANGED",
          "IDENTITY_KEYS_CHANGED",
          "IDENTITY_SOURCE_REMOVED"
        ],
        "type": "string"
      },
      "ProviderPoolLayoutChange": {
        "description": "One reason a table of a proposed Provider Pool layout differs from the\nserved one (PARABLE-3903).",
        "properties": {
          "column": {
            "description": "The physical column the reason is about, in the proposed layout when it\nhas one, else in the served layout. Null for a table-level reason.",
            "nullable": true,
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/ProviderPoolLayoutChangeReasonEnum"
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "ProviderPoolLayoutChangeReasonEnum": {
        "description": "Why `classify_layout` gave a table its class. Each reason implies one\nclass; the table's class is the highest of its reasons.",
        "enum": [
          "ACCESS_CHANGED",
          "DOCUMENTATION_CHANGED",
          "COLUMN_ADDED",
          "STRUCT_FIELD_ADDED",
          "COLUMN_WIDENED",
          "COLUMN_REMOVED",
          "STRUCT_FIELD_REMOVED",
          "TABLE_REMOVED",
          "TABLE_ADDED",
          "TABLE_RENAMED",
          "COLUMN_RENAMED",
          "COLUMN_SOURCE_CHANGED",
          "COLUMN_RETYPED",
          "COLUMN_ENCODING_CHANGED",
          "COLUMN_STRUCTURAL_CHANGED",
          "DEDUP_KEYS_CHANGED",
          "ORDERING_COLUMN_CHANGED",
          "CUSTOM_FIELD_ROUTING_CHANGED",
          "PARENT_MERGE_KEY_CHANGED",
          "PARTITION_DATE_CHANGED",
          "DATA_KIND_CHANGED",
          "DELETION_SEMANTICS_CHANGED",
          "DEDUPLICATE_ACROSS_LOADS_CHANGED",
          "SYNTHETIC_KEY_CHANGED"
        ],
        "type": "string"
      },
      "ProviderPoolLayoutClassification": {
        "description": "What moving a Workspace tap from its served Provider Pool layout to a\nproposed one needs, table by table (PARABLE-3903, amended EDR-0082\ndecisions 11 and 12). Produced by the mapping planner's `classify_layout`\n(Go `promotemeta.ClassifyLayout`); an approval echoes `classificationHash`.",
        "properties": {
          "classificationHash": {
            "description": "`sha256:` over the canonical JSON of every other field.",
            "type": "string"
          },
          "identityImpact": {
            "$ref": "#/components/schemas/ProviderPoolIdentityImpactEnum"
          },
          "proposedPlanHash": {
            "type": "string"
          },
          "rebuildTableIds": {
            "description": "Ids of the tables a rebuild writes, in `tables` order. The root table is\nincluded when only the identity impact requires the rebuild.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "requiresRebuild": {
            "description": "Whether the change needs a rebuild item: a table classed NEW_TABLE,\nTABLE_REBUILD or TAP_REBUILD, or an identity impact other than\nIDENTITY_UNCHANGED. Otherwise the layout head moves.",
            "type": "boolean"
          },
          "servedPlanHash": {
            "description": "`plan_hash` of the served and proposed layouts.",
            "type": "string"
          },
          "tables": {
            "description": "One entry per root or child table of either layout, root first, then\nchildren by table id.",
            "items": {
              "$ref": "#/components/schemas/ProviderPoolTableClassification"
            },
            "type": "array"
          }
        },
        "required": [
          "servedPlanHash",
          "proposedPlanHash",
          "tables",
          "identityImpact",
          "requiresRebuild",
          "rebuildTableIds",
          "classificationHash"
        ],
        "type": "object"
      },
      "ProviderPoolQueryInput": {
        "description": "One SQL statement to run against the Provider Pools, or to plan without\nrunning.",
        "properties": {
          "parameters": {
            "description": "Positional values for $1, $2, ... placeholders, sent through Flight SQL\nprepared-statement binding. Values are never interpolated into SQL.\nEach value is a JSON scalar (string, finite number, boolean, or null).\nIdentifiers and the arguments of search_available_data cannot be bound.",
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "nullable": true,
            "type": "array"
          },
          "sql": {
            "description": "Single read-only SQL statement. Text.Sql rejects empty; maxLength is 100000 bytes.",
            "maxLength": 100000,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "sql"
        ],
        "type": "object"
      },
      "ProviderPoolRebuildReasonEnum": {
        "description": "What caused a Provider Pool rebuild queue item. Changes coalesced into one\nitem keep every reason.",
        "enum": [
          "CONNECTOR_TAP_CHANGED",
          "WORKSPACE_TAP_CHANGED",
          "PLANNER_CHANGED",
          "OPERATOR_REQUESTED",
          "ROLLOUT"
        ],
        "type": "string"
      },
      "ProviderPoolRebuildStateEnum": {
        "description": "Lifecycle of one Provider Pool rebuild queue item. Abort is allowed from\nAPPROVED, BUILDING, READY and FAILED; retry moves FAILED back to APPROVED.\nStale is derived from the request time, not stored.",
        "enum": [
          "PENDING_APPROVAL",
          "SUPERSEDED",
          "DECLINED",
          "APPROVED",
          "BUILDING",
          "READY",
          "SWAPPED",
          "CLEANED",
          "FAILED",
          "ABORTED"
        ],
        "type": "string"
      },
      "ProviderPoolTableClassEnum": {
        "description": "Vocabulary of a Provider Pool layout change (PARABLE-3903, amended\nEDR-0082 decisions 10-12). The mapping planner's `classify_layout` compares\na Workspace tap's served layout with a proposed one, table by table.\nWhat one table's change from the served layout to the proposed one needs.\nOrdered from least to most work; a table with several changes takes the\nhighest.",
        "enum": [
          "NONE",
          "CATALOG_ONLY",
          "ADDITIVE",
          "REMOVED",
          "NEW_TABLE",
          "TABLE_REBUILD",
          "TAP_REBUILD"
        ],
        "type": "string"
      },
      "ProviderPoolTableClassification": {
        "description": "The class of one root or child table of a proposed Provider Pool layout\nagainst the served one (PARABLE-3903). A table's quarantine table follows\nits class.",
        "properties": {
          "cascaded": {
            "description": "Whether the class came from a change of the root table rather than of\nthis table: a child whose parent merge key, partition date, data kind or\nwrite semantics changed. Children hang off the root only, so the root is\nthe one table a class cascades from.",
            "type": "boolean"
          },
          "changes": {
            "description": "Every change found, in a stable order.",
            "items": {
              "$ref": "#/components/schemas/ProviderPoolLayoutChange"
            },
            "type": "array"
          },
          "kind": {
            "$ref": "#/components/schemas/CatalogTableKindEnum",
            "description": "MAIN or CHILD."
          },
          "proposedPhysicalName": {
            "description": "Physical name in the proposed layout; null for a removed table.",
            "nullable": true,
            "type": "string"
          },
          "servedPhysicalName": {
            "description": "Physical name in the served layout; null for a new table.",
            "nullable": true,
            "type": "string"
          },
          "tableClass": {
            "$ref": "#/components/schemas/ProviderPoolTableClassEnum",
            "description": "The highest class among the table's changes, NONE when there are none."
          },
          "tableId": {
            "description": "\"\" for the root table, else the exploded child's source path joined by\n\"__\". Tables of the two layouts are matched on it.",
            "type": "string"
          }
        },
        "required": [
          "tableId",
          "kind",
          "tableClass",
          "changes",
          "cascaded"
        ],
        "type": "object"
      },
      "ProviderPredicate": {
        "description": "One condition on a value.",
        "properties": {
          "expected": {
            "description": "The operand: a scalar for equals, not_equals and contains, a [low, high]\npair for between, a list for any_of, and null for exists, not_exists,\nempty and non_empty.",
            "nullable": true
          },
          "operator": {
            "$ref": "#/components/schemas/ProviderPredicateOperatorEnum",
            "description": "How the value is compared."
          },
          "source": {
            "$ref": "#/components/schemas/ProviderValueRef",
            "description": "The value the condition reads."
          }
        },
        "required": [
          "source",
          "operator"
        ],
        "type": "object"
      },
      "ProviderPredicateOperatorEnum": {
        "description": "How a predicate compares the value it reads.",
        "enum": [
          "equals",
          "not_equals",
          "between",
          "any_of",
          "exists",
          "not_exists",
          "empty",
          "non_empty",
          "contains"
        ],
        "type": "string"
      },
      "ProviderProductLogo": {
        "description": "Product identities and logo.dev lookups registered when a Provider is added to the platform.",
        "properties": {
          "domains": {
            "description": "Only unambiguous domain aliases. Shared domains require an explicit product key.",
            "items": {
              "description": "Valid domain name (RFC 1035 compliant)",
              "maxLength": 255,
              "pattern": "^[a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?)*$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array"
          },
          "key": {
            "maxLength": 100,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "logoDomain": {
            "description": "Verified logo.dev domain for this product, independent of its provider and aliases.",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?)*$",
            "type": "string"
          },
          "logoName": {
            "description": "Verified logo.dev name lookup, when the product has no suitable domain lookup.",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          }
        },
        "required": [
          "key",
          "name",
          "domains"
        ],
        "type": "object"
      },
      "ProviderQuotaOwnerKindEnum": {
        "enum": [
          "google_cloud_project",
          "flow_credential"
        ],
        "type": "string"
      },
      "ProviderQuotaOwnerSelector": {
        "properties": {
          "credentialPaths": {
            "description": "Required for Google project owners and absent for flow credential owners.\nDot-separated aliases must resolve to the same value.",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "nullable": true,
            "type": "array"
          },
          "kind": {
            "$ref": "#/components/schemas/ProviderQuotaOwnerKindEnum"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "ProviderRequestAuth": {
        "description": "How the request is authenticated.",
        "properties": {
          "mode": {
            "$ref": "#/components/schemas/ProviderRequestAuthModeEnum"
          },
          "password": {
            "description": "Auth mode `basic` only: the credential field holding the password.",
            "nullable": true,
            "type": "string"
          },
          "username": {
            "description": "Auth mode `basic` only: the credential field holding the user name.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "mode"
        ],
        "type": "object"
      },
      "ProviderRequestAuthModeEnum": {
        "description": "How a provider operation request is authenticated.",
        "enum": [
          "none",
          "strategy",
          "body",
          "basic"
        ],
        "type": "string"
      },
      "ProviderRequestTemplate": {
        "description": "The request an operation sends.",
        "properties": {
          "allowedConfiguredHost": {
            "description": "An ingestion field declared as a Network.Url, not secret, whose host the\nrequest may also go to, exactly: a self-hosted provider the connection is\nconfigured to reach. The suffixes above still apply to every other host,\nand the host must still be public. A Workspace editor can change the\nfield, so the request then carries the credential to any public host the\neditor saves (PARABLE-5237).",
            "nullable": true,
            "type": "string"
          },
          "allowedHostSuffixes": {
            "description": "DNS suffixes the resolved endpoint host may use. Matching is on a label\nboundary, so `api.example.com` matches `example.com` and\n`notexample.com` does not.",
            "items": {
              "description": "Valid domain name (RFC 1035 compliant)",
              "maxLength": 255,
              "pattern": "^[a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?)*$",
              "type": "string"
            },
            "type": "array"
          },
          "auth": {
            "$ref": "#/components/schemas/ProviderRequestAuth",
            "description": "How the request is authenticated."
          },
          "defaults": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Literal values for referenced configuration fields that are absent or\nempty (PARABLE-5253), keyed `ingestion.\u003cfield\u003e` or `credential.\u003cfield\u003e`:\nthe value the provider or sync assumes when the field is left blank and\nno schema default supplies it (Tableau's `apiVersion` 3.29, its Default\nsite `\"\"`). An ingestion field's schema default applies before these.\nEach key names a declared, non-secret field the request references. A\ndefault is catalog text, not configuration, yet it takes its field's\ntaint and placement rules. Only a declared default may be empty, and\nnever in the endpoint. A default for a field that supplies the base URL\nmust be an absolute https URL without a query or fragment, under\nallowedHostSuffixes.",
            "nullable": true,
            "type": "object"
          },
          "endpoint": {
            "description": "One of: an absolute https URL with references in its path and query; one\nreference to an ingestion field declared as a Network.Url (the whole URL\ncomes from configuration); that reference followed by a path or query\n(`${ingestion.baseUrl}/api/3.29/auth/signin`); or an https URL whose host\nstarts with one non-secret ingestion field used as a DNS label\n(`https://${ingestion.tenantName}.workday.com/...`), when the literal\nrest of the host lies under an allowed suffix (PARABLE-4930).\nEvery form is checked against the allowed destinations once resolved,\nbefore anything is sent.",
            "type": "string"
          },
          "fallbackEndpoint": {
            "description": "The endpoint used when the configured URL `endpoint` starts with is absent\nor empty (PARABLE-5253): the provider's fixed host, for a connection that\noverrides it only when set (Workday's optional `baseUrl` in place of\n`https://${ingestion.tenantName}.workday.com`). Only an\nendpoint that starts with a `${ingestion.\u003cNetwork.Url field\u003e}` reference\nwith no default may declare one. It is an absolute https URL, or the\nhost-label form, never a configured URL itself, and its host must lie\nunder allowedHostSuffixes: allowedConfiguredHost does not admit it,\nbecause the configured field is empty whenever it is used.",
            "nullable": true,
            "type": "string"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Request headers by name. A value may hold `${ingestion.\u003cfield\u003e}`\nreferences, and `${credential.\u003cfield\u003e}` references only in a header\nwhose name says it carries a credential (Authorization, Cookie, or a name\ncontaining token, key, auth, secret, session, password, signature or\ncredential). A header the transport or the strategy's auth sets is\nrefused.",
            "nullable": true,
            "type": "object"
          },
          "method": {
            "$ref": "#/components/schemas/HttpMethodEnum",
            "description": "HTTP method: GET, or POST for providers whose check is a call (Slack's\nauth.test, a GraphQL query)."
          },
          "queryParams": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Query parameters added to the endpoint's query, by name. A value may hold\n`${ingestion.\u003cfield\u003e}` references, never a credential.",
            "nullable": true,
            "type": "object"
          },
          "replaySafe": {
            "description": "Whether the request may be sent again when a rule answers retry. A GET\nalways may; a POST only when declared safe (a read-only query), so a\nsingle-use exchange is never replayed.",
            "nullable": true,
            "type": "boolean"
          },
          "requestBody": {
            "description": "A JSON body for a POST, sent as application/json unless the strategy's\nextraHeaders set another content type. A string value may hold\n`${ingestion.\u003cfield\u003e}` references. A `${credential.\u003cfield\u003e}` reference\nis allowed only when auth mode is `body` (a sign-in) and must be a whole\nstring value.",
            "nullable": true
          }
        },
        "required": [
          "method",
          "endpoint",
          "allowedHostSuffixes",
          "auth"
        ],
        "type": "object"
      },
      "ProviderSignedToken": {
        "description": "A short-lived JWT a check signs from the strategy's credential, for a\nprovider whose sign-in takes a token the client mints itself, such as a\nTableau Connected App (PARABLE-5254). Requests read it as\n`${signed.\u003cname\u003e}`; it is secret, so it goes only in a header that carries\na credential or as a whole string value of a sign-in body. It is minted\nfresh for each request: the executor adds `exp` (now plus\nlifetimeSeconds) and a random `jti`, and sets the JOSE header's `alg` and\n`typ`. The signing key never enters the token, a URL, a log or a result.",
        "properties": {
          "algorithm": {
            "$ref": "#/components/schemas/ProviderSigningAlgorithmEnum",
            "description": "How the token is signed."
          },
          "claims": {
            "description": "The claims, as a JSON object. A member is a string, which may hold the\nsame references as a header value, a number, a boolean, or a list of\nstrings. The executor sets `exp` and `jti`; neither they nor `iat` and\n`nbf` may be declared."
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "JOSE header members besides `alg` and `typ`: only `kid` and `iss`. A\nvalue may hold `${credential.\u003cfield\u003e}` and non-secret\n`${ingestion.\u003cfield\u003e}` references.",
            "nullable": true,
            "type": "object"
          },
          "key": {
            "description": "The credential field holding the signing key. It must be declared\nx-secret, and no claim or header value may reference it.",
            "type": "string"
          },
          "lifetimeSeconds": {
            "description": "How long the token is valid, from 1 to 600 seconds.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "name": {
            "description": "Unique within the workflow; the name `${signed.\u003cname\u003e}` reads.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "algorithm",
          "key",
          "lifetimeSeconds",
          "claims"
        ],
        "type": "object"
      },
      "ProviderSigningAlgorithmEnum": {
        "description": "How a check signs a token it mints (PARABLE-5254).",
        "enum": [
          "HS256"
        ],
        "type": "string"
      },
      "ProviderValueNamespaceEnum": {
        "description": "Where a reference reads its value from.",
        "enum": [
          "credential",
          "ingestion",
          "clock",
          "item",
          "step",
          "response",
          "signed"
        ],
        "type": "string"
      },
      "ProviderValueRef": {
        "description": "A declarative provider operation: one bounded request and the ordered rules\nthat read its response (PARABLE-4273). Request strings carry references in\nthe `${namespace.path}` form, for example `${ingestion.customReportUrl}`.\nA value a predicate or an extract reads, or the list an iteration runs\nover.",
        "properties": {
          "namespace": {
            "$ref": "#/components/schemas/ProviderValueNamespaceEnum",
            "description": "The source of the value."
          },
          "path": {
            "description": "Where in the namespace. For `response`: `status`, `text`,\n`headers.\u003cname\u003e`, `body`, or `body.\u003cdotted path\u003e`.",
            "type": "string"
          }
        },
        "required": [
          "namespace",
          "path"
        ],
        "type": "object"
      },
      "PublicEncryptionKey": {
        "description": "Public key information for encrypting payloads.",
        "properties": {
          "algorithm": {
            "$ref": "#/components/schemas/EncryptionAlgorithm",
            "description": "Encryption algorithm to use."
          },
          "keyId": {
            "description": "Unique identifier for this key, used for key rotation support.",
            "type": "string"
          },
          "publicKey": {
            "description": "PEM-encoded public key.",
            "pattern": "^-----BEGIN PUBLIC KEY-----[\\s\\S]*-----END PUBLIC KEY-----\\s*$",
            "type": "string"
          }
        },
        "required": [
          "publicKey",
          "algorithm",
          "keyId"
        ],
        "type": "object"
      },
      "PublishAdminParableProposalInput": {
        "properties": {
          "bumpMajorVersion": {
            "description": "Raise the major version with this publish. See\n`PublishWorkspaceParableProposalInput.bumpMajorVersion` for why this is a\nflag on publish and not a seventeenth action.",
            "nullable": true,
            "type": "boolean"
          },
          "correlationId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedProposalVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedReviewHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "expectedRootRefVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedSchemaEpoch": {
            "description": "Nullable because `required` on a number means non-zero, and the current schema epoch\nIS zero. Declared required, this field could never be satisfied: every publish was\nrejected as \"expectedSchemaEpoch: required field\" while carrying the one correct\nvalue. Absent reads as epoch 0, which is what the server compares against.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "message": {
            "nullable": true,
            "type": "string"
          },
          "selectedWorkspaceIds": {
            "description": "Nullable because `required` on a list means non-empty, and empty is the only legal\nvalue for the `parable` and `all` target modes -- `resolveDeploymentTargets` rejects\na non-empty list for both. Only `some` names Workspaces.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "targetMode": {
            "$ref": "#/components/schemas/ParableWorkspaceTargetModeEnum"
          }
        },
        "required": [
          "expectedProposalVersion",
          "expectedAggregateRevision",
          "expectedRootRefVersion",
          "expectedReviewHash",
          "targetMode",
          "idempotencyKey",
          "correlationId"
        ],
        "type": "object"
      },
      "PublishAdminParableProposalResult": {
        "properties": {
          "contentChanged": {
            "type": "boolean"
          },
          "proposal": {
            "$ref": "#/components/schemas/ParableProposalRecordView"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          },
          "rollout": {
            "$ref": "#/components/schemas/ParableDeploymentRolloutSummaryView"
          },
          "targets": {
            "items": {
              "$ref": "#/components/schemas/ParableDeploymentRolloutTargetView"
            },
            "type": "array"
          },
          "version": {
            "$ref": "#/components/schemas/ParableVersionSummaryView"
          }
        },
        "required": [
          "receipt",
          "proposal",
          "version",
          "rollout",
          "targets",
          "contentChanged"
        ],
        "type": "object"
      },
      "PublishArtifactInput": {
        "description": "Input for publishing a TenantArtifact as a TenantConnectorTap. The artifact\nmust be `READY` with a non-null `dataSchema`. Publish creates a fresh\n`TenantConnectorTap` whose `outputSchema` is a snapshot copy of\n`artifact.dataSchema` at publish time; the two diverge thereafter.\nOptional `name` overrides the auto-derived `{slug(filename)}-{first 8 hex of artifactId}`\ndefault; on a unique-index collision the request returns NAME_ALREADY_EXISTS.\n`tableName` becomes the dataset/table identifier in the data catalog and is\nused by the query layer when querying the published data. It is also stored\nas the artifact catalogSlug / table identity on the published ARTIFACT tap.",
        "properties": {
          "artifactId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "requestId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tableName": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "requestId",
          "artifactId",
          "tableName"
        ],
        "type": "object"
      },
      "PublishWorkspaceParableProposalInput": {
        "properties": {
          "bumpMajorVersion": {
            "description": "Raise the major version with this publish (PARABLE-1469).\nA FLAG ON PUBLISH RATHER THAN AN ACTION OF ITS OWN. `ProductParableActionEnum`\nalready carries sixteen members and this workstream has been deleting the\nduplicates among them, not adding more; a major-bump member would need a\n`requires`, a `from` and a `surface` row identical to PUBLISH's in every\nfield, because it IS a publish -- same seat, same states, same writes. What\ndiffers is only the number the publish assigns. The screen still gets its\n\"separate control beside the publish CTA\": one CTA, one modifier.\nNullable because `required` on a boolean means true, and the ordinary\npublish sends false. Absent reads as false, which is what makes the major\nnever automatic.\nRejected on a line that follows an upstream, which does not own its major.\nPresent on this input as well as the admin one because a Workspace-built\nParable is an independent line: it owns its numbers, and leaving the flag\noff here would be a capability that exists on one surface only.",
            "nullable": true,
            "type": "boolean"
          },
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedPrepareFingerprint": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "expectedReviewHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedAggregateRevision",
          "expectedReviewHash",
          "expectedPrepareFingerprint",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "PublishWorkspaceParableProposalResult": {
        "properties": {
          "delivery": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableDeliverySummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "proposal": {
            "$ref": "#/components/schemas/ParableProposalRecordView"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          },
          "version": {
            "$ref": "#/components/schemas/ParableDeploymentVersionSummaryView"
          }
        },
        "required": [
          "receipt",
          "proposal",
          "version"
        ],
        "type": "object"
      },
      "PublishedParablePlot": {
        "description": "Immutable published Plot contract consumed by tenant-scoped data-plane services.",
        "properties": {
          "contract": {
            "description": "Authenticated compiler metadata from this sealed definition. A missing\ncontract refuses data scans rather than inferring one from SQL columns.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlotContractReceipt"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "currentOutput": {
            "description": "A Report Plot's current output (PARABLE-4449): the output of the newest\nCOMPLETE Report run whose result for this Plot fits this publication's\ncontract. Derived when served; null until such a run completes.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportPlotOutput"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "dependencies": {
            "items": {
              "$ref": "#/components/schemas/ParablePlotDependencyView"
            },
            "type": "array"
          },
          "lastPinAt": {
            "description": "Pin time from the QueryRun pin set. Catalog watermark; omitted until the\nfirst successful materialization. Never publish or commit time.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "maxCost": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotCostCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxExternalCalls": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotExternalCallsCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxRuntime": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotRuntimeCap"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "nullable": true,
            "type": "object"
          },
          "outputSchemaQueryRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outputSchemaUpdatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "paneValues": {
            "description": "This Parable's values for the Panes this Plot's SQL names (PARABLE-6255),\nserved when a run hydrates its source from the published Plot. Null or\nempty when the Plot reads none.",
            "items": {
              "$ref": "#/components/schemas/PaneRelationValues"
            },
            "nullable": true,
            "type": "array"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parablePublishedSequence": {
            "description": "ParableCommit.publishedSequence of the sealed publication; the same\nnumber TenantParableSummary.versionNumber shows.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "parableSlug": {
            "description": "ProductParable.slug is the permanent catalog address, independent of handle edits.",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "plotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "plotSlug": {
            "description": "The other half of parables.{parableSlug}.{plotSlug}, and typed the same way\nsince PARABLE-3249 narrowed ParablePlot.slug. Both segments are read back as\nbare SQL identifiers, so both must be fixed points of the engine's\nsanitizer; while this one was Identity.Slug it could carry a hyphen and\npublish an address the catalog then registered under a different name.",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "publishedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "publishedSql": {
            "description": "SQL text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "requiresReportingRun": {
            "description": "The published definition's Requires Reporting Run flag. A Report Plot's\ncatalog table is its current output and never the Plot's fixed table.\nDefaults to false so a reader decodes an older server's reply.",
            "type": "boolean"
          },
          "runSummary": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParablePlotRunSummaryView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "sealedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "view": {
            "description": "Nothing stores this Plot's output: it is not a Report Plot. The catalog\nthen serves\nparables.{parableSlug}.{plotSlug} as a view of publishedSql. Defaults to\nfalse so a reader of an older server's reply keeps the stored table.",
            "type": "boolean"
          }
        },
        "required": [
          "publishedSql",
          "parableId",
          "parableSlug",
          "plotId",
          "plotSlug",
          "parablePublishedSequence",
          "sealedCommitId",
          "publishedAt",
          "dependencies",
          "requiresReportingRun",
          "view"
        ],
        "type": "object"
      },
      "PullWorkspaceParableDeliveryInput": {
        "properties": {
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedAggregateRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "PullWorkspaceParableDeliveryResult": {
        "properties": {
          "delivery": {
            "$ref": "#/components/schemas/ParableDeliverySummaryView"
          },
          "proposal": {
            "$ref": "#/components/schemas/ParableProposalRecordView"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          }
        },
        "required": [
          "receipt",
          "proposal",
          "delivery"
        ],
        "type": "object"
      },
      "PulseCapturePolicy": {
        "description": "A Workspace's Pulse capture policy (PARABLE-7170): the apps Pulse skips on\nevery Mac of the Workspace. The protected list built into Pulse (password\nmanagers, banking, health) always applies too, and this policy cannot\nremove an app from it. Pulse records which skipped app was in front and\nfor how long, and never its window title, UI tree, or screen text.",
        "properties": {
          "skippedBundleIdPrefixes": {
            "description": "macOS bundle ID prefixes, lower case and sorted. An entry skips every\napp whose bundle ID starts with it: `com.tinyspeck.slackmacgap` skips\nSlack, and `com.microsoft` skips every Microsoft app.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "skippedBundleIdPrefixes"
        ],
        "type": "object"
      },
      "PulseDeviceEnrollment": {
        "description": "The answer to pulseDeviceEnrollment.",
        "properties": {
          "outcome": {
            "$ref": "#/components/schemas/PulseDeviceEnrollmentOutcome"
          }
        },
        "required": [
          "outcome"
        ],
        "type": "object"
      },
      "PulseDeviceEnrollmentOutcome": {
        "description": "Whether a Pulse sign-in from this browser session also enrolls the Mac\n(PARABLE-7159). web-api answers it with the same rule that decides the\ndevice connect bundle when it mints a Pulse code, so the connect page and\nthe code cannot disagree.",
        "enum": [
          "ENROLLS",
          "NO_WORKSPACE",
          "NOT_ACTIVE_MEMBER",
          "NO_PULSE_CONNECTOR",
          "SEVERAL_PULSE_CONNECTORS",
          "ACTIVITY_STREAM_OFF",
          "CHECK_FAILED",
          "IMPERSONATING",
          "API_TOKEN_SESSION"
        ],
        "type": "string"
      },
      "QualityCheckComparator": {
        "description": "Comparator used by a quality check's threshold rule.",
        "enum": [
          "LT",
          "LTE",
          "GT",
          "GTE",
          "EQ",
          "NEQ"
        ],
        "type": "string"
      },
      "QualityCheckEvidence": {
        "description": "Optional evidence captured for a failed check: sample row keys, top-N\nviolating values, run-over-run deltas. Bounded size so the row never\nblows up.",
        "properties": {
          "message": {
            "nullable": true,
            "type": "string"
          },
          "runOverRunDelta": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "sampleKeys": {
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "topViolatingValues": {
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "type": "object"
      },
      "QualityCheckResult": {
        "description": "Per-check pass / fail with structured evidence. spec.id is stable across\nruns so dashboards can chart pass rate over time.",
        "properties": {
          "comparator": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/QualityCheckComparator"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "evidence": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/QualityCheckEvidence"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "observed": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "spec": {
            "$ref": "#/components/schemas/QualityCheckSpec"
          },
          "status": {
            "$ref": "#/components/schemas/QualityRunStatus"
          },
          "threshold": {
            "format": "double",
            "nullable": true,
            "type": "number"
          }
        },
        "required": [
          "spec",
          "status"
        ],
        "type": "object"
      },
      "QualityCheckSpec": {
        "description": "Stable definition of one check. id is stable across runs; gate identifies\nwhich Data Quality Gate it belongs to.",
        "properties": {
          "description": {
            "type": "string"
          },
          "gate": {
            "$ref": "#/components/schemas/QualityGate"
          },
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "gate",
          "description"
        ],
        "type": "object"
      },
      "QualityGate": {
        "description": "Data Quality Gate assigned by parable-dataplane-quality-rs when a\nservices/provider-transformations queue job evaluates a check.",
        "enum": [
          "GATE_1",
          "GATE_2",
          "GATE_3",
          "GATE_4",
          "GATE_5"
        ],
        "type": "string"
      },
      "QualityResultLifecycle": {
        "description": "Distinguishes promote-time vs cadence whole-table quality re-verification.",
        "enum": [
          "promote",
          "cadence"
        ],
        "type": "string"
      },
      "QualityRuleConfig": {
        "description": "Discriminated union of all quality rule variants.",
        "discriminator": {
          "mapping": {
            "dupe_rate": "#/components/schemas/DupeRateRule",
            "no_future_timestamp": "#/components/schemas/NoFutureTimestampRule",
            "null_rate": "#/components/schemas/NullRateRule",
            "referential_integrity": "#/components/schemas/ReferentialIntegrityRule",
            "row_count_not_suspicious": "#/components/schemas/RowCountNotSuspiciousRule",
            "string_pattern_rate": "#/components/schemas/StringPatternRateRule",
            "temporal_order": "#/components/schemas/TemporalOrderRule",
            "timeline_gaps": "#/components/schemas/TimelineGapsRule",
            "timestamp_coverage": "#/components/schemas/TimestampCoverageRule"
          },
          "propertyName": "type"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/NullRateRule"
          },
          {
            "$ref": "#/components/schemas/DupeRateRule"
          },
          {
            "$ref": "#/components/schemas/TimestampCoverageRule"
          },
          {
            "$ref": "#/components/schemas/TemporalOrderRule"
          },
          {
            "$ref": "#/components/schemas/NoFutureTimestampRule"
          },
          {
            "$ref": "#/components/schemas/TimelineGapsRule"
          },
          {
            "$ref": "#/components/schemas/StringPatternRateRule"
          },
          {
            "$ref": "#/components/schemas/ReferentialIntegrityRule"
          },
          {
            "$ref": "#/components/schemas/RowCountNotSuspiciousRule"
          }
        ]
      },
      "QualityRuleTypeEnum": {
        "description": "Discriminator literal for the QualityRuleConfig union variants.\nThe wire/storage value is the snake_case form.",
        "enum": [
          "null_rate",
          "dupe_rate",
          "timestamp_coverage",
          "temporal_order",
          "no_future_timestamp",
          "timeline_gaps",
          "string_pattern_rate",
          "referential_integrity",
          "row_count_not_suspicious"
        ],
        "type": "string"
      },
      "QualityRunStatus": {
        "description": "Overall outcome of a data-quality run.",
        "enum": [
          "PASS",
          "FAIL",
          "SKIPPED"
        ],
        "type": "string"
      },
      "QueryGuidance": {
        "description": "Parable's built-in guidance for finding and querying Workspace data. It is\nthe same for every Workspace; a Workspace's own edited Powers are read\nthrough the Powers operations by people who may use Ponder.",
        "properties": {
          "texts": {
            "items": {
              "$ref": "#/components/schemas/QueryGuidanceText"
            },
            "type": "array"
          },
          "version": {
            "description": "Changes whenever any text does.",
            "type": "string"
          }
        },
        "required": [
          "version",
          "texts"
        ],
        "type": "object"
      },
      "QueryGuidanceText": {
        "description": "One built-in text that teaches querying, such as Pool search.",
        "properties": {
          "content": {
            "description": "Markdown text",
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "name": {
            "description": "The text's stable key, such as `pool-search`.",
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "title",
          "description",
          "content"
        ],
        "type": "object"
      },
      "QueryPriorityClass": {
        "description": "QUERY queue priority. Lower numeric rank values run first in SQL ordering.",
        "enum": [
          "INTERACTIVE",
          "SCHEDULED",
          "BACKFILL"
        ],
        "type": "string"
      },
      "QueryRefusal": {
        "description": "Why the Query Layer refused a statement, in words its author can act on.",
        "properties": {
          "code": {
            "description": "The Query Layer's code, such as QL-PL-002.",
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "message"
        ],
        "type": "object"
      },
      "QueryResultColumn": {
        "description": "One column of a result or of a planned statement.",
        "properties": {
          "arrowType": {
            "description": "The column's Arrow type, such as `int64`, `utf8`, `decimal(38, 9)` or\n`timestamp[us, tz=UTC]`. It says how to read a value that arrives as text.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "scalarRef": {
            "description": "The Parable scalar the column carries, such as `Contact.Email`; null when\nit carries none.",
            "maxLength": 128,
            "minLength": 3,
            "nullable": true,
            "pattern": "^[A-Z][A-Za-z0-9]*\\.[A-Z][A-Za-z0-9]*$",
            "type": "string"
          }
        },
        "required": [
          "name",
          "arrowType"
        ],
        "type": "object"
      },
      "QueryResultTruncation": {
        "description": "What a result view left out. A view with any flag set is not the whole\nresult.",
        "properties": {
          "capture": {
            "description": "Reading stopped at 3 MiB of Arrow, so the statement may hold more rows\nthan were read.",
            "type": "boolean"
          },
          "rows": {
            "description": "Rows after the last one shown were left out to keep the view inside its\n60,000-character budget.",
            "type": "boolean"
          },
          "values": {
            "description": "At least one shown text or binary value was cut at 2,000 characters; a\ncut value ends with `[cut: ...]`.",
            "type": "boolean"
          }
        },
        "required": [
          "rows",
          "values",
          "capture"
        ],
        "type": "object"
      },
      "QueryResultView": {
        "description": "A SQL result a model can read: typed columns and whole leading rows as\nJSON.\nEach row is a JSON array with one value per column, in column order. A\nvalue is written by its column's arrowType:\n1. A 64-bit integer inside the JavaScript safe range, a smaller integer and\na finite float are JSON numbers. A 64-bit integer past 2^53 - 1 is text.\n2. A decimal is text with every digit of its scale, such as `1.50`.\n3. A date is `YYYY-MM-DD`. A timestamp is ISO 8601 with the fraction its\nunit holds; one with a time zone is the UTC instant and ends with `Z`,\none without is a wall-clock time and carries no zone.\n4. A time is `HH:MM:SS` with its fraction, a duration ISO 8601 seconds.\n5. Binary is base64. A struct is an object, a list an array, a map an\nobject.\n6. A null is JSON null.\nNothing is rounded.",
        "properties": {
          "catalogVersion": {
            "description": "The catalog the statement was planned against. Null while the Query Layer\ndoes not report one with a result.",
            "nullable": true,
            "type": "string"
          },
          "columns": {
            "items": {
              "$ref": "#/components/schemas/QueryResultColumn"
            },
            "type": "array"
          },
          "elapsedMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "requestId": {
            "description": "The request's id in the Workspace API's logs.",
            "type": "string"
          },
          "returnedRows": {
            "description": "The rows in this view. It is never the statement's total.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "rows": {
            "items": {
              "description": "Any valid JSON value: object, array, primitive, or null"
            },
            "type": "array"
          },
          "truncated": {
            "$ref": "#/components/schemas/QueryResultTruncation"
          },
          "warnings": {
            "description": "What to change to see what was left out, in plain sentences.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "columns",
          "rows",
          "returnedRows",
          "truncated",
          "elapsedMs",
          "requestId",
          "warnings"
        ],
        "type": "object"
      },
      "QueryRunStatus": {
        "description": "Query-run lifecycle owned by the QUERY admission queue ledger.\nThe queue row -- not duroxide -- is the system of record, including\nBUDGET_EXCEEDED as a distinct terminal/pausable state.",
        "enum": [
          "PENDING",
          "CLAIMED",
          "RUNNING",
          "SUCCEEDED",
          "FAILED",
          "CANCELLED",
          "BUDGET_EXCEEDED"
        ],
        "type": "string"
      },
      "ReadParableProblemMessagePowerInput": {
        "additionalProperties": false,
        "properties": {
          "name": {
            "description": "A name the model guessed wrong is an ordinary miss, not a validation failure.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableProblemMessageToolScope"
          }
        },
        "required": [
          "scope",
          "name"
        ],
        "type": "object"
      },
      "ReadParableProblemMessagePowerResult": {
        "properties": {
          "power": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/AgentSkillSnapshot"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "recovery": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ParableProblemMessagePowerReadStatusEnum"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "ReadParableProblemRunPingInput": {
        "additionalProperties": false,
        "description": "A resumed Run segment reading a Ping it asked, to settle the held call with\nthe answers. Only a Ping attached to this Run's assistant Message is\nreadable: a Run cannot read a question another conversation asked.",
        "properties": {
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "pingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "pingId"
        ],
        "type": "object"
      },
      "ReadParableProblemRunPowerInput": {
        "additionalProperties": false,
        "description": "A durable Run reading one Power by name, as the person who started it. The\nanswer is ReadParableProblemMessagePowerResult.",
        "properties": {
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "name": {
            "description": "A name the model guessed wrong is an ordinary miss, not a validation failure.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "name"
        ],
        "type": "object"
      },
      "RecordCustomizedPetRevisionInput": {
        "description": "Records a completed personalized v2 asset revision after server-managed\nstorage has verified its canonical reference, bytes, geometry, alpha channel,\nSHA-256 digest, and signed 11-row/74-cell quality attestation. Generation and\nsemantic review happen outside this write.",
        "properties": {
          "animations": {
            "additionalProperties": {
              "$ref": "#/components/schemas/PetAnimation"
            },
            "type": "object"
          },
          "contentHash": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "expectedCurrentAssetRevisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lookFrames": {
            "items": {
              "$ref": "#/components/schemas/PetLookFrame"
            },
            "type": "array"
          },
          "playback": {
            "$ref": "#/components/schemas/PetPlaybackPolicy"
          },
          "prompt": {
            "description": "Markdown text",
            "maxLength": 8192,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "provenance": {
            "$ref": "#/components/schemas/PetAssetProvenance"
          },
          "sourceUri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "spriteSheet": {
            "$ref": "#/components/schemas/PetSpriteSheet"
          },
          "spriteVersionNumber": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 2,
            "minimum": 2,
            "type": "integer"
          }
        },
        "required": [
          "expectedRevision",
          "idempotencyKey",
          "expectedCurrentAssetRevisionId",
          "prompt",
          "spriteVersionNumber",
          "spriteSheet",
          "animations",
          "lookFrames",
          "playback",
          "sourceUri",
          "contentHash",
          "provenance"
        ],
        "type": "object"
      },
      "RecordParableProblemRunDiagnosticEventInput": {
        "additionalProperties": false,
        "description": "One safe diagnostic event of a Run with Debug accepted. The payload's kind\nis the event's kind. A durable Run's segment names its step; web-api's own\nevents before a Run ran in steps (its dispatch) are step 0 (PARABLE-5063).",
        "properties": {
          "correlationId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "safePayload": {
            "$ref": "#/components/schemas/PonderRunDiagnosticPayload"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "workflowAdapter": {
            "$ref": "#/components/schemas/ParableProblemRunAdapterEnum"
          },
          "workflowRunId": {
            "type": "string"
          }
        },
        "required": [
          "workflowAdapter",
          "workflowRunId",
          "stepIndex",
          "safePayload",
          "correlationId",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "RecordParableProblemRunStepInput": {
        "additionalProperties": false,
        "description": "ponder-api records one attempt of a turn segment: STARTED before it runs,\nthen COMPLETED with the outcome or FAILED. A step index with a COMPLETED\nattempt is finished; recording it again answers 409 with the stored outcome.",
        "properties": {
          "attempt": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "finishedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "idempotencyKey": {
            "description": "Replaying the call that last wrote the row is a no-op.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outcome": {
            "description": "Required for COMPLETED, optional for FAILED, absent for STARTED.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderRunStepOutcome"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/PonderRunStepStatusEnum"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "stepIndex",
          "attempt",
          "status",
          "idempotencyKey",
          "startedAt"
        ],
        "type": "object"
      },
      "RecordParableProblemRunStepResult": {
        "properties": {
          "attempt": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/PonderRunStepStatusEnum"
          },
          "stepIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "runId",
          "stepIndex",
          "attempt",
          "status"
        ],
        "type": "object"
      },
      "RecordParableProofEvaluationInput": {
        "properties": {
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "notes": {
            "description": "Markdown text",
            "maxLength": 4096,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "outcome": {
            "$ref": "#/components/schemas/ParableProofOutcomeEnum"
          }
        },
        "required": [
          "expectedProblemRevision",
          "outcome",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "RecordParableProofEvaluationResult": {
        "properties": {
          "evaluation": {
            "$ref": "#/components/schemas/ParableProofEvaluation"
          },
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "resolution": {
            "$ref": "#/components/schemas/ParableProblemResolutionView"
          }
        },
        "required": [
          "evaluation",
          "problemRevision",
          "resolution"
        ],
        "type": "object"
      },
      "ReferentialIntegrityRule": {
        "description": "Quality rule: foreign key must exist in referenced dataset.",
        "properties": {
          "localColumn": {
            "type": "string"
          },
          "maxOrphanRate": {
            "format": "double",
            "type": "number"
          },
          "referencedColumn": {
            "type": "string"
          },
          "referencedDatasetId": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "localColumn",
          "referencedDatasetId",
          "referencedColumn",
          "maxOrphanRate"
        ],
        "type": "object"
      },
      "RefreshDeviceRoutingTokenInput": {
        "description": "Device-facing routing token refresh (PARABLE-7161). The device proves\npossession of its registered key with the same ES256 proof as re-key.\nSignature base: `v1:routing-token:{deviceRef}:{timestamp}`, signed by the\ndevice's currently registered key.",
        "properties": {
          "deviceRef": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "signature": {
            "description": "base64 of the 64-byte ES256 signature (r || s) over the base string.",
            "type": "string"
          },
          "timestamp": {
            "description": "Unix epoch seconds at signing time (replay window enforced).",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "deviceRef",
          "timestamp",
          "signature"
        ],
        "type": "object"
      },
      "RefreshPayload": {
        "properties": {
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "refreshToken": {
            "description": "JSON Web Token string",
            "pattern": "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+$",
            "type": "string"
          },
          "token": {
            "description": "JSON Web Token string",
            "pattern": "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+$",
            "type": "string"
          }
        },
        "required": [
          "token",
          "refreshToken",
          "expiresAt"
        ],
        "type": "object"
      },
      "RekeyDeviceInput": {
        "description": "Device-facing re-key request: the old device key signs the new public key\n(old-key-signs-new-key, Pulse 0010). Signature base:\n`v1:rekey:{deviceRef}:{timestamp}:{sha256_hex(newDevicePubKey)}` where\nnewDevicePubKey is the exact base64 string below, signed ES256 by the\ndevice's currently registered key.",
        "properties": {
          "deviceRef": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "newDeviceKeyKind": {
            "description": "Where the device keeps the new key's private half (PARABLE-7168). It\nreplaces the device record's deviceKeyKind with the key. Null or absent\n(Pulse versions before PARABLE-7168) stores null: the new key's home is\nnot known. Not part of the signature base: like the enrollment value,\nit is the device's own report.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/DeviceKeyKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "newDevicePubKey": {
            "description": "New device public key: base64 uncompressed SEC1 P-256 point.",
            "type": "string"
          },
          "signature": {
            "description": "base64 of the 64-byte ES256 signature (r || s) over the base string.",
            "type": "string"
          },
          "timestamp": {
            "description": "Unix epoch seconds at signing time (replay window enforced).",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "deviceRef",
          "newDevicePubKey",
          "timestamp",
          "signature"
        ],
        "type": "object"
      },
      "ReleasePanelSnapshotInfo": {
        "description": "Frozen result rows for an early-access release panel. Projection of web-db\nReleasePanelSnapshot for the current tenant; the tenant relation stays\nserver-side (resolved from the request context).",
        "properties": {
          "capturedAt": {
            "description": "When the capture script ran the source query.",
            "format": "date-time",
            "type": "string"
          },
          "panelSlug": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "payload": {
            "description": "Panel-shaped result rows as stored by the capture script."
          },
          "sourceNote": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "panelSlug",
          "payload",
          "capturedAt"
        ],
        "type": "object"
      },
      "RememberPonderToolApprovalPolicyInput": {
        "properties": {
          "policy": {
            "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum",
            "description": "Remembered approval policy; Ask is rejected because this action resolves a pending Ask."
          },
          "scope": {
            "$ref": "#/components/schemas/PonderToolPolicyRememberScopeEnum"
          }
        },
        "required": [
          "scope",
          "policy"
        ],
        "type": "object"
      },
      "ReplaceParablePlotDependenciesInput": {
        "description": "Replaces one downstream Plot's complete edge set for a draft ref or sealed\npublication. An empty dependencies list removes the set.",
        "properties": {
          "dependencies": {
            "items": {
              "$ref": "#/components/schemas/ParablePlotDependencyInput"
            },
            "type": "array"
          },
          "downstreamParableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "downstreamPlotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParablePlotDependencyScopeEnum"
          },
          "scopeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "downstreamParableId",
          "downstreamPlotId",
          "scope",
          "scopeId",
          "dependencies"
        ],
        "type": "object"
      },
      "ReplaceParablePlotDependenciesResult": {
        "properties": {
          "dependencyCount": {
            "format": "double",
            "type": "number"
          },
          "downstreamParableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "downstreamPlotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParablePlotDependencyScopeEnum"
          },
          "scopeId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updated": {
            "description": "False when the requested edge set already matched the projection.",
            "type": "boolean"
          }
        },
        "required": [
          "downstreamParableId",
          "downstreamPlotId",
          "scope",
          "scopeId",
          "dependencyCount",
          "updated"
        ],
        "type": "object"
      },
      "ReplaceParableProblemRelationshipsInput": {
        "properties": {
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "relationships": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemRelationship"
            },
            "maxItems": 100,
            "type": "array"
          }
        },
        "required": [
          "expectedProblemRevision",
          "relationships",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ReplaceParableProblemResponsibilitiesInput": {
        "properties": {
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "responsibilities": {
            "items": {
              "$ref": "#/components/schemas/ParableProblemResponsibility"
            },
            "maxItems": 100,
            "type": "array"
          }
        },
        "required": [
          "expectedProblemRevision",
          "responsibilities",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ReplaceParableRaciInput": {
        "properties": {
          "assignments": {
            "items": {
              "$ref": "#/components/schemas/ParableRaciInput"
            },
            "type": "array"
          },
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "expectedAggregateRevision",
          "assignments"
        ],
        "type": "object"
      },
      "ReplaceParableRaciResult": {
        "properties": {
          "assignments": {
            "items": {
              "$ref": "#/components/schemas/ParablePrimaryRaciAssignmentView"
            },
            "type": "array"
          },
          "primary": {
            "$ref": "#/components/schemas/ParablePrimaryView"
          }
        },
        "required": [
          "primary",
          "assignments"
        ],
        "type": "object"
      },
      "ReportQueryRunOutput": {
        "description": "What a Report query run's finale committed (PARABLE-4449): the Delta table\nit wrote once under its own prefix. web-api records it on the Plot's result\nas ParableReportPlotOutput, with the producer contract compiled from the\nReport run's captured publication.",
        "properties": {
          "commitDigest": {
            "description": "SHA-256 of the commit JSON that created deltaVersion.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "contentDigest": {
            "description": "The digest of the output's rows, whatever their order\n(QueryRuns.outputContentDigest, PARABLE-5756). Null when the finale\nrecorded none.",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "deltaVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "inputLineage": {
            "description": "The DataFusion PinSet the query run planned under."
          },
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "planAuthority": {
            "description": "What the run's plan read under its Report run's execution context\n(PARABLE-4446). An output without it is never recorded.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReportPlanAuthority"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "reusedFromQueryRunId": {
            "description": "The query run that wrote tableUri, when this query run reused its output\ninstead of executing (PARABLE-5765). Null when this query run wrote it.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tableUri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          }
        },
        "required": [
          "tableUri",
          "deltaVersion",
          "commitDigest",
          "outputSchema",
          "inputLineage"
        ],
        "type": "object"
      },
      "ReportRunBudgetInput": {
        "description": "New caps for a query run that query-runner parked at its budget\n(BUDGET_EXCEEDED). Raise budget on a Report Plot (web-api and its\nweb-admin-api twin) and the admin ledger control on one query run take this\none shape.\nAt least one cap is required, and query-runner decides: each cap must exceed\nthe run's current cap and what it has already used -- spend for `maxCost`,\ncalls for `maxExternalCalls`, and the time since the run started for\n`maxRuntime`. The caps are the run's; the Plot's published caps never change.",
        "properties": {
          "maxCost": {
            "description": "Smallest currency unit, as every Plot cost cap.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "maxExternalCalls": {
            "format": "double",
            "minimum": 0,
            "nullable": true,
            "type": "number"
          },
          "maxRuntime": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "RepositionPersonPetInput": {
        "properties": {
          "displayOrder": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "expectedRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "positionXPermille": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 1000,
            "minimum": 0,
            "type": "integer"
          },
          "positionYPermille": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 1000,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "expectedRevision",
          "idempotencyKey",
          "positionXPermille",
          "positionYPermille",
          "displayOrder"
        ],
        "type": "object"
      },
      "RequestAdmissionKindEnum": {
        "enum": [
          "fixed",
          "provider_budget"
        ],
        "type": "string"
      },
      "RequestParableProblemRunApprovalInput": {
        "description": "Runtime service binding; internal operation, never accepted from a browser.",
        "properties": {
          "argumentsDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "expectedRunRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "operationId": {
            "type": "string"
          },
          "toolCallAdapter": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "toolCallId": {
            "type": "string"
          },
          "toolName": {
            "type": "string"
          },
          "workflowAdapter": {
            "$ref": "#/components/schemas/ParableProblemRunAdapterEnum"
          },
          "workflowRunId": {
            "type": "string"
          }
        },
        "required": [
          "expectedRunRevision",
          "workflowAdapter",
          "workflowRunId",
          "toolCallAdapter",
          "toolCallId",
          "operationId",
          "toolName",
          "argumentsDigest",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ReserveArtifactPublicationInput": {
        "additionalProperties": false,
        "properties": {
          "expectedBaseRevisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "namespaceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "namespaceSlug": {
            "description": "An immutable data-catalog segment: parables.{parable_slug}.{plot_slug}",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
            "type": "string"
          },
          "revisionId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tables": {
            "items": {
              "$ref": "#/components/schemas/ArtifactPublicationTableInput"
            },
            "type": "array"
          }
        },
        "required": [
          "namespaceId",
          "namespaceSlug",
          "revisionId",
          "tables"
        ],
        "type": "object"
      },
      "ReserveArtifactPublicationResult": {
        "properties": {
          "receipt": {
            "$ref": "#/components/schemas/ArtifactPublicationReceipt"
          },
          "uploads": {
            "description": "Only tables still requiring a source upload receive a grant.",
            "items": {
              "$ref": "#/components/schemas/ArtifactPublicationUpload"
            },
            "type": "array"
          }
        },
        "required": [
          "receipt",
          "uploads"
        ],
        "type": "object"
      },
      "ResolveParableProblemMessagePanePreviewInput": {
        "additionalProperties": false,
        "properties": {
          "resolution": {
            "$ref": "#/components/schemas/ParablePaneResolveBatchInput"
          },
          "rootRefId": {
            "nullable": true,
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableProblemMessageToolScope"
          }
        },
        "required": [
          "scope",
          "resolution"
        ],
        "type": "object"
      },
      "ResolveParableProblemRunPanePreviewInput": {
        "additionalProperties": false,
        "description": "The data a Run's Pane preview asks for while it is captured, resolved as\nthe person who started the Run. The answer is ParablePaneResolveBatchResult.",
        "properties": {
          "dispatchSnapshotDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "resolution": {
            "$ref": "#/components/schemas/ParablePaneResolveBatchInput"
          },
          "rootRefId": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "resolution"
        ],
        "type": "object"
      },
      "ResolvedModelChoice": {
        "additionalProperties": false,
        "description": "A model a call resolved to, the processor that serves it, and where it came from.",
        "properties": {
          "choice": {
            "$ref": "#/components/schemas/ModelChoice"
          },
          "inputTokenLimit": {
            "description": "The model's input limit in tokens, from the platform candidate that\nresolved (PlatformModelCandidate.inputTokenLimit). Null for any other\nchoice.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "modelReleaseId": {
            "description": "The catalog Model Release, for a chat choice: the release itself, or the\nrelease the catalog routes a processor model id to.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "processor": {
            "$ref": "#/components/schemas/ModelProcessor"
          },
          "routeModelId": {
            "description": "The processor's model id for a catalog Model Release, from its route.",
            "nullable": true,
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/ModelChoiceSource"
          }
        },
        "required": [
          "source",
          "choice",
          "processor"
        ],
        "type": "object"
      },
      "ResolvedParableProblemRunPersonaSelection": {
        "description": "Historical: the Persona, profile, models and provider products a Run started before PARABLE-6164 resolved.",
        "properties": {
          "aggregateDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "availabilityObservationIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "capabilityObservationIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "configurationRevision": {
            "description": "Historical Persona configuration revision; old snapshots remain immutable.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "graphFilter": {
            "description": "Accepted graph orientation, independent from historical Promotes.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderProblemGraphFilter"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "interactions": {
            "description": "Null on historical resolved snapshots; reads as no selected interactions.",
            "items": {
              "$ref": "#/components/schemas/ResolvedPersonaInteractionSelection"
            },
            "maxItems": 100,
            "minItems": 0,
            "nullable": true,
            "type": "array"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableProblemRunPersonaResolutionKindEnum"
          },
          "personaId": {
            "description": "Stable first-class Persona ID.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personaParableId": {
            "description": "Historical Persona-as-Parable identity; old snapshots remain immutable.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personaRefId": {
            "description": "Historical Persona-as-Parable Ref; absent on current snapshots.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personaRefRevision": {
            "description": "Historical Persona-as-Parable revision; absent on current snapshots.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableRevisionRef"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "personaRevision": {
            "description": "First-class Persona revision captured for current Runs.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "priceRateIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "profileId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "promotesSchema": {
            "description": "Historical decoding only; new snapshots omit the retired Promotes schema.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderPersonaPromotesSchema"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "promotesSchemaDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "nullable": true,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "prompt": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "promptDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "providerProductIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "rankedCandidates": {
            "description": "Null only on historical snapshots; current acceptance captures every enabled candidate.",
            "items": {
              "$ref": "#/components/schemas/ResolvedPersonaRankedModelCandidateSnapshot"
            },
            "maxItems": 101,
            "minItems": 1,
            "nullable": true,
            "type": "array"
          },
          "resolutionPolicyVersion": {
            "type": "string"
          },
          "resolvedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "slot": {
            "$ref": "#/components/schemas/PersonaPersonalitySnapshotSlotEnum"
          },
          "source": {
            "$ref": "#/components/schemas/PersonaResolutionSourceEnum"
          }
        },
        "required": [
          "kind",
          "source",
          "profileId",
          "slot",
          "prompt",
          "promptDigest",
          "capabilityObservationIds",
          "availabilityObservationIds",
          "providerProductIds",
          "priceRateIds",
          "resolutionPolicyVersion",
          "resolvedAt",
          "aggregateDigest"
        ],
        "type": "object"
      },
      "ResolvedPersonaInteractionSelection": {
        "properties": {
          "configurationId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/PersonaInteractionSnapshotKindEnum"
          },
          "prompt": {
            "description": "Markdown text",
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "promptDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "rankedModelReleaseIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 0,
            "type": "array"
          },
          "toolHandle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          }
        },
        "required": [
          "configurationId",
          "kind",
          "prompt",
          "promptDigest",
          "rankedModelReleaseIds"
        ],
        "type": "object"
      },
      "ResolvedPersonaRankedModelCandidateSnapshot": {
        "description": "Historical: one ranked model a Persona-era Run captured before dispatch.",
        "properties": {
          "availabilityObservationIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "capabilityObservationIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "configYaml": {
            "description": "The ranked model's authored OpenRouter request config (YAML) exactly as saved.",
            "maxLength": 16384,
            "type": "string"
          },
          "contextTokenLimit": {
            "description": "Combined input/output context window pinned for this execution; null means unknown.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "modelReleaseId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outputTokenLimit": {
            "description": "Observed model response maximum pinned for this execution; null means unknown.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "priceRateIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "processor": {
            "description": "The AI processor the route sends the conversation to, which the\nWorkspace's AI model policy admitted (PARABLE-4675). Null only on\nsnapshots accepted before the field existed.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ModelProcessor"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "providerProductIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 0,
            "type": "array"
          },
          "rank": {
            "description": "Positive JavaScript-safe ordering rank",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "routeBindingConfigurationDigest": {
            "description": "Lowercase hexadecimal SHA-256 digest",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "routeBindingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "rank",
          "modelReleaseId",
          "routeBindingId",
          "routeBindingConfigurationDigest",
          "configYaml",
          "capabilityObservationIds",
          "availabilityObservationIds",
          "providerProductIds",
          "priceRateIds"
        ],
        "type": "object"
      },
      "RespondToParableProblemPingInput": {
        "properties": {
          "answers": {
            "items": {
              "$ref": "#/components/schemas/ParablePingAnswerInput"
            },
            "maxItems": 200,
            "minItems": 0,
            "type": "array"
          },
          "body": {
            "description": "Bundle-level closing words. The server composes one when it is absent.",
            "maxLength": 65536,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "expectedInboxItemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedInboxItemRevision",
          "answers",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "ResponseExtractionConfig": {
        "description": "=============================================================================\nResponse Extraction\n=============================================================================\nHow to extract records from an API response.",
        "properties": {
          "primaryKey": {
            "description": "Primary key field name for deduplication (e.g., 'id')",
            "type": "string"
          },
          "responseFormat": {
            "description": "Wire format of the response body. Defaults to JSON when null. Set to JSONL\nfor newline-delimited JSON responses (one record per line, body is not a\nsingle JSON document), e.g. Mixpanel's Raw Event Export API. With JSONL,\nset responsePath to '@' so each line becomes a record.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ResponseFormatEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "responsePath": {
            "description": "JMESPath expression to extract records from response.\nExamples: '@' (response is array), 'data', 'results.items'",
            "nullable": true,
            "type": "string"
          },
          "responsePathFallback": {
            "description": "Fallback JMESPath when the primary responsePath returns null.\nHandles polymorphic responses where the array may be at a different path\n(e.g., TestrRail suites: 'suites' normally, 'root_array' for single-suite projects).",
            "nullable": true,
            "type": "string"
          },
          "responseValidation": {
            "description": "Validation rules for API response success/error handling",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ResponseValidation"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "syntheticPrimaryKey": {
            "description": "Synthetic primary key configuration. When present, generates a unique ID\nby hashing the specified fields. The primaryKey field becomes the output\nfield name where the hash is stored (e.g., primaryKey: \"id\").",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SyntheticPrimaryKeyConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "primaryKey"
        ],
        "type": "object"
      },
      "ResponseFormatEnum": {
        "description": "Wire format of a successful HTTP response body, controlling how the\ningestion engine turns the body into records before responsePath extraction.",
        "enum": [
          "json",
          "jsonl"
        ],
        "type": "string"
      },
      "ResponseLinks": {
        "properties": {
          "first": {
            "nullable": true,
            "type": "string"
          },
          "last": {
            "nullable": true,
            "type": "string"
          },
          "next": {
            "nullable": true,
            "type": "string"
          },
          "prev": {
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "ResponseMeta": {
        "properties": {
          "requestId": {
            "description": "Unique identifier for the request",
            "type": "string"
          },
          "totalCount": {
            "description": "Total count of items for paginated responses",
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "requestId"
        ],
        "type": "object"
      },
      "ResponseValidation": {
        "description": "Validation rules for API response handling.",
        "properties": {
          "errorField": {
            "description": "Field containing error code/message (e.g., 'error')",
            "type": "string"
          },
          "okField": {
            "description": "Field indicating success in response body (e.g., 'ok')",
            "type": "string"
          },
          "transientErrors": {
            "description": "Application-level errors that are transient and should be retried (e.g., 'ratelimited')",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "okField",
          "errorField"
        ],
        "type": "object"
      },
      "RestBatchConfig": {
        "additionalProperties": false,
        "description": "Batch packer configuration for Google-style multipart/mixed batch endpoints\n(e.g., Gmail https://gmail.googleapis.com/batch/gmail/v1, Drive\nhttps://www.googleapis.com/batch/drive/v3). Used to bundle high-cardinality\ndetail fetches (one sub-request per parent record) into a single HTTP round\ntrip. Requires the tap's pagination type to be `none` (one sub-response per\nparent). `perParentAuth` is optional: when present each sub-request is\nauthed per parent (DWD), when absent the outer POST's auth applies to all\nsub-requests.",
        "properties": {
          "endpoint": {
            "description": "Multipart batch endpoint URL. Always invoked with POST and\n`Content-Type: multipart/mixed; boundary=...`.",
            "type": "string"
          },
          "format": {
            "description": "Batch wire format. Null or absent = Google-style multipart/mixed (default).\n\"json\" = JSON batch (e.g., Microsoft Graph $batch, OData $batch).",
            "nullable": true,
            "type": "string"
          },
          "maxSubRequests": {
            "description": "Maximum sub-requests packed into a single multipart body. Google\nrecommends \u003c= 100 sub-requests per batch. Typical value: 50.",
            "format": "int64",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "endpoint",
          "maxSubRequests"
        ],
        "type": "object"
      },
      "RestEndpointConfig": {
        "additionalProperties": false,
        "description": "Connector Tap Definition\nA tap represents a single data stream (e.g., repos, issues, users).\nEach tap defines how to extract one entity type from an API.\nTaps are API-type-aware: REST taps use RestEndpointConfig,\nGraphQL taps use GraphQLEndpointConfig.\n=============================================================================\nEndpoint Configurations\n=============================================================================\nREST API endpoint configuration.\nSupports template variables resolved from tenant config or parent tap records.\nExamples: '/orgs/{orgId}/repos', '/repos/{full_name}/issues'\nStrict: every key shapes the Provider request, so a reader that does not know\na key must reject it rather than send a broader request (PARABLE-4569). The\nnested object types are marked too.",
        "properties": {
          "batch": {
            "description": "Optional batch packer config for Google-style multipart/mixed batch APIs.\nWhen set, the runtime packs one sub-request per parent record (built from\nthis RestEndpointConfig's endpoint/method/headers) into a single\nmultipart/mixed POST to `batch.endpoint`. When the tap declares\n`perParentAuth`, each sub-request gets its own `Authorization` header so\nit impersonates the parent user (Google domain-wide delegation). When\n`perParentAuth` is omitted, the outer POST's auth applies to every\nsub-request -- used for admin-token detail taps such as Drive Docs/Sheets.\nWhen unset, the runtime executes one HTTP request per parent record.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/RestBatchConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "bodyEncoding": {
            "description": "Serialization for the POST/PUT/PATCH body. Defaults to JSON when null. Set\nto FORM (application/x-www-form-urlencoded) for APIs that reject a JSON\nbody, e.g. Mixpanel's Engage query API.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/BodyEncodingEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "endpoint": {
            "description": "API endpoint path (supports {variable} templates).\nVariables are resolved from parent tap records or tenant config.",
            "type": "string"
          },
          "headers": {
            "description": "Additional headers to include",
            "nullable": true
          },
          "method": {
            "$ref": "#/components/schemas/HttpMethodEnum",
            "description": "HTTP method (default: GET)"
          },
          "parentDataFilterBodyInject": {
            "description": "Optional inject of workspace parentDataFilters values into requestBody.\nUsed by root taps that take an allowlist array (e.g. Purview\nuserPrincipalNameFilters) without depending on a parent tap.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParentDataFilterBodyInject"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "parentDataFilterQueryInject": {
            "description": "Optional inject of workspace parentDataFilters values into a query param\n(typically $filter). Used by root taps that take an allowlist in the\nquery string without depending on a parent tap.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParentDataFilterQueryInject"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "pathParamEncodings": {
            "description": "Optional provider-neutral encoding rules for path template parameters.",
            "items": {
              "$ref": "#/components/schemas/PathParamEncodingRule"
            },
            "nullable": true,
            "type": "array"
          },
          "queryParams": {
            "description": "Default query parameters to include",
            "nullable": true
          },
          "requestBody": {
            "description": "Request body template (for POST endpoints, e.g., Notion search)",
            "nullable": true
          }
        },
        "required": [
          "endpoint",
          "method"
        ],
        "type": "object"
      },
      "RetireParableProblemContextInput": {
        "properties": {
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedProblemRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "RetractParableCommitInput": {
        "description": "Input for retractParableCommit (PARABLE-1793 / EDR-0077).\n# Retract is NOT Revoke\nRevoke narrows WHO holds a Parable. Retract blocks WHICH Commit anyone new\nmay take. Neither substitutes for the other: deploy a broken version to\nexactly the right audience and Revoke's only lever is taking the Parable\naway from people who should have it.\n# Availability only\nA retraction moves no pointer, mints no Rollout, changes no audience and\nwrites nothing to `parable_commit`. It appends one row to\n`parable_commit_retraction` and cancels the Deliveries for that Commit that\nhave not landed. Every Deployment already pinned to the Commit keeps\nrendering it (EDR-0077 A1); what stops is new reach, and a successor publish\nlifts it.\n# Authorization\nRESPONSIBLE on the SOURCE Deployment -- the line that minted the Commit --\nsettled by the owner on 2026-08-08. Same anchor, surface and seat as Revoke.\nThe case for Accountable was blast radius, and blast radius is not the axis\nthe RACI seats are cut on: recoverability is. Retract is remedial work, and\nthe moment it matters most is the moment a Responsible actor has just\nshipped a broken version -- the worst possible time to require an escalation.",
        "properties": {
          "commitId": {
            "description": "The published Commit to withdraw. Must carry a `publishedSequence`: an\nunpublished Commit has never been available to anyone, so there is nothing\nto withdraw.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "commitId",
          "reason",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "RetractParableCommitResult": {
        "description": "Result of retractParableCommit (PARABLE-1793).\n`successorCommitId` is the newest non-retracted published Commit on the same\nline, and it is reported rather than acted on. The strand guard has already\nproved it exists whenever anything is pinned -- a retraction that would leave\na pinned Deployment with no available successor is refused outright -- so\nnaming it here is what lets a caller (or an operator) see where those\nDeployments would move to.\nNull in two cases, and they are different: the line has no other available\npublished Commit (only reachable when nothing is pinned), or this response is\nthe REPLAY of an idempotent retry, which reports the retraction and the\npinned count without re-running the scan. A caller that needs the successor\nafter a retry reads it from the version history rather than from a replay.",
        "properties": {
          "cancelledDeliveries": {
            "description": "Deliveries that had not landed and are now cancelled with the typed reason\n`source_retracted`. Applied ones are untouched: undoing delivered content\nis withdrawal, which PARABLE-1469 criterion 3 forbids.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "commitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pinnedDeployments": {
            "description": "Deployments currently pinned to the retracted Commit. They keep rendering it.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptView"
          },
          "successorCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "receipt",
          "commitId",
          "pinnedDeployments",
          "cancelledDeliveries"
        ],
        "type": "object"
      },
      "RetryConfig": {
        "description": "Retry behavior for rate-limited or failed requests.",
        "properties": {
          "maxRetries": {
            "description": "Maximum number of retries before failing",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "maxRetryTimeSeconds": {
            "description": "Maximum total retry time in seconds before giving up",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "respectRetryAfter": {
            "description": "Whether to respect Retry-After headers from the API",
            "nullable": true,
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "RetryWorkspaceParableDeliveryInput": {
        "properties": {
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedAggregateRevision",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "RetryWorkspaceParableDeliveryResult": {
        "properties": {
          "delivery": {
            "$ref": "#/components/schemas/ParableDeliverySummaryView"
          },
          "proposal": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableProposalRecordView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          }
        },
        "required": [
          "receipt",
          "delivery"
        ],
        "type": "object"
      },
      "RevalidateParablePlotsInput": {
        "description": "Retry unchecked or stale R8 verdicts on a ref without changing content.\nCurrent completed verdicts, including SQL errors, are skipped (PARABLE-3593).\nThe reason it exists is PV_SYS_001: when query-layer was unreachable at save\ntime the save still succeeded and recorded a synthetic gating diagnostic, so\npublication stays blocked until a later validation clears it. This command\nrecovers without an edit, including when the Plot retains a last-good schema.\nNo expectedRefVersion and no expectedAggregateRevision, unlike every write\nbeside it: this command writes engine-owned columns only and advances no\nversion, so there is nothing for a compare-and-swap to guard. The idempotency\nkey is still required -- it is what makes a retried request one receipt.",
        "properties": {
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "idempotencyKey"
        ],
        "type": "object"
      },
      "RevalidateParablePlotsResult": {
        "properties": {
          "plotDiagnostics": {
            "items": {
              "$ref": "#/components/schemas/PlotValidationRecordView"
            },
            "type": "array"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptViewBase"
          }
        },
        "required": [
          "receipt",
          "plotDiagnostics"
        ],
        "type": "object"
      },
      "RevokeParableDeploymentInput": {
        "description": "Input for revokeParableDeployment (PARABLE-1793 / PARABLE-1469 \"Reach\").\nNarrows WHO holds a Parable after a mis-targeted Rollout. The store command\nbehind it (`Store.RevokeDeployment`) has been complete and covered by seven\nintegration tests since PARABLE-1588; PARABLE-1772 established that no\ncommit ever declared a route for it. This is that declaration.\n# Authorization is RACI, not a permission leaf\nPARABLE-1589 asked for an `admin.parables.revoke` leaf and is superseded. A\nleaf-holder could revoke a Parable they hold no RACI on and therefore cannot\nsee, and PARABLE-1469 names that exact shape as a defect. The handler\nrequires RESPONSIBLE on the SOURCE Deployment -- the line that published the\nRollout -- through the one predicate in the action contract. The\n`admin.parables.manage` leaf on the route is the surface gate only: it\nasks whether this actor does Parable work on admin at all, never which\nParable is theirs.\nResponsible rather than Accountable because Revoke is recoverable: a\nsuccessor publish widens the audience again.",
        "properties": {
          "expectedRolloutId": {
            "description": "The Rollout the caller believed was current. Without it a revocation racing\na publish could narrow an audience the caller never saw.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reason": {
            "description": "Why. Written to the revocation ledger -- removing access is the kind of act\nthat has to answer \"why\" later.",
            "type": "string"
          },
          "retainedTenantIds": {
            "description": "The audience that SURVIVES, not the audience to remove.\nStating the end state rather than a delta makes the command idempotent\nagainst a moving target: two concurrent revocations naming the same\nsurvivors agree, whereas two deltas applied in either order do not. Empty\nmeans full retraction of the audience.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "retainedTenantIds",
          "reason",
          "expectedRolloutId",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "RevokeParableDeploymentResult": {
        "description": "Result of revokeParableDeployment (PARABLE-1793).\n`revokedTenantIds` is stated rather than left to a diff of two Rollouts, for\nthe same reason the ledger writes an explicit `not_selected` target row: a\nrepublish with a narrower audience already drops Workspaces silently by not\nwriting rows for them, and \"who lost access\" should be a fact you can read\nrather than one you have to reconstruct.",
        "properties": {
          "cancelledDeliveries": {
            "description": "In-flight Deliveries stopped mid-flight. Applied ones are not undone.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "fullyRevoked": {
            "description": "True when no customer Workspace survives. The Parable's origin line clears\nits current-Rollout pointer and reads Personal again.",
            "type": "boolean"
          },
          "receipt": {
            "$ref": "#/components/schemas/ParableCommandReceiptView"
          },
          "removedCollectiveAssignments": {
            "description": "Collective RACI rows removed -- what actually takes the Parable away from\nthe people in a revoked Workspace, as opposed to only from its Directory.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "revokedTenantIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "rolloutId": {
            "description": "The NEW Rollout carrying the narrowed target set.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "receipt",
          "rolloutId",
          "revokedTenantIds",
          "fullyRevoked",
          "cancelledDeliveries",
          "removedCollectiveAssignments"
        ],
        "type": "object"
      },
      "Role": {
        "description": "Wire Role shape is owned by web-shared-types; local alias keeps barrels stable.",
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "parentRoleId": {
            "description": "Parent role ID for tracking/analytics. Null if this is a base role.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "permissions": {
            "items": {
              "description": "Hierarchical permission string (e.g., 'admin.users.read')",
              "maxLength": 255,
              "pattern": "^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9]*)*$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "name",
          "permissions"
        ],
        "type": "object"
      },
      "RolesPaginatedResponse": {
        "description": "Paginated response for listing tenant-assignable roles.",
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/Role"
            },
            "type": "array"
          },
          "limit": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "offset": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "total": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "RotateScimTokenResult": {
        "properties": {
          "bearerToken": {
            "type": "string"
          }
        },
        "required": [
          "bearerToken"
        ],
        "type": "object"
      },
      "RowCountNotSuspiciousRule": {
        "properties": {
          "suspiciousCounts": {
            "items": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "maximum": 9007199254740991,
              "minimum": -9007199254740991,
              "type": "integer"
            },
            "type": "array"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "suspiciousCounts"
        ],
        "type": "object"
      },
      "RunArtifactSchemaInferenceInput": {
        "description": "Input for running (or re-running) schema inference on an existing artifact.",
        "properties": {
          "artifactId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "artifactId"
        ],
        "type": "object"
      },
      "RunMessageCausationRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ProblemMessageCausationKindEnum"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "runId"
        ],
        "type": "object"
      },
      "SafeModelExecution": {
        "description": "One safe, provider-reported model request receipt. Raw provider payloads\nstay external. A model request on a model route (PARABLE-6164) names the\nroute; one made before routes names its ranked catalog candidate.",
        "properties": {
          "cachedInputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "candidateRank": {
            "description": "Historical: the ranked candidate's rank. Null on a model route.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "costMicros": {
            "description": "The request's cost in millionths of USD. On a model route it is a\nlist-price estimate: web-api prices the call's tokens at the route's\nmodels.dev prices, not at the charge OpenRouter states, which AI Usage\nrecords. A receipt from before model routes holds OpenRouter's charge.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "currencyCode": {
            "maxLength": 3,
            "minLength": 3,
            "nullable": true,
            "type": "string"
          },
          "inputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "modelId": {
            "description": "The route's pi model id. Null before model routes.",
            "maxLength": 300,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "modelReleaseId": {
            "description": "Historical: the ranked candidate's catalog Model Release. Null on a model route.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "processor": {
            "description": "The AI processor the request went to. Null before model routes.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ModelProcessor"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "providerId": {
            "description": "The route's pi provider id `server:harness:account`. Null before model routes.",
            "maxLength": 300,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "providerSlug": {
            "maxLength": 128,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "reasoningTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "requestIndex": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 256,
            "minimum": 1,
            "type": "integer"
          },
          "responseId": {
            "maxLength": 256,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "routeBindingId": {
            "description": "Historical: the ranked candidate's catalog route binding. Null on a model route.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "servedModel": {
            "description": "The models.dev key of the model that answered. Null before model routes.",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "upstreamInferenceCostMicros": {
            "description": "Upstream inference charge for BYOK routes, when OpenRouter reports it.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "requestIndex"
        ],
        "type": "object"
      },
      "SafeRunOutcome": {
        "properties": {
          "artifactIds": {
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "error": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableErrorView"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "summary": {
            "description": "Markdown text",
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          }
        },
        "required": [
          "artifactIds"
        ],
        "type": "object"
      },
      "SafeRunUsage": {
        "description": "Safe aggregate usage facts and per-request receipts; raw provider events remain external.",
        "properties": {
          "duration": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "externalCallCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "inputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "modelExecutions": {
            "items": {
              "$ref": "#/components/schemas/SafeModelExecution"
            },
            "maxItems": 128,
            "minItems": 0,
            "type": "array"
          },
          "modelRequestCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "outputTokens": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "modelExecutions"
        ],
        "type": "object"
      },
      "SamlConnectionReadback": {
        "description": "SAML connection projection read back from Stytch. The IdP certificate is\nwrite-only and is never echoed here. The SP signing certificate is public\nsetup material that the Workspace administrator uploads to the IdP.",
        "properties": {
          "acsUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "audienceUri": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "connectionId": {
            "type": "string"
          },
          "displayName": {
            "nullable": true,
            "type": "string"
          },
          "emailAttribute": {
            "nullable": true,
            "type": "string"
          },
          "firstNameAttribute": {
            "nullable": true,
            "type": "string"
          },
          "identityProvider": {
            "$ref": "#/components/schemas/SamlIdentityProvider"
          },
          "idpCertificateExpiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "idpCertificateIssuer": {
            "nullable": true,
            "type": "string"
          },
          "idpEntityId": {
            "description": "RFC 3986 URI for connection strings and non-HTTP resources",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "idpSsoUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "lastNameAttribute": {
            "nullable": true,
            "type": "string"
          },
          "nameIdFormat": {
            "type": "string"
          },
          "spSigningCertificate": {
            "nullable": true,
            "type": "string"
          },
          "spSigningCertificateExpiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "spSigningCertificateIssuer": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "connectionId",
          "idpEntityId",
          "idpSsoUrl",
          "status",
          "identityProvider",
          "nameIdFormat",
          "acsUrl",
          "audienceUri"
        ],
        "type": "object"
      },
      "SamlIdentityProvider": {
        "description": "Identity providers with provider-specific SAML handling in Stytch.",
        "enum": [
          "generic",
          "jumpcloud",
          "okta",
          "microsoft-entra",
          "google-workspace",
          "onelogin",
          "pingfederate",
          "rippling",
          "salesforce",
          "duo",
          "cyberark",
          "classlink",
          "keycloak",
          "miniorange",
          "shibboleth"
        ],
        "type": "string"
      },
      "SaveOidcConnectionInput": {
        "properties": {
          "clientId": {
            "type": "string"
          },
          "clientSecret": {
            "type": "string"
          },
          "displayName": {
            "nullable": true,
            "type": "string"
          },
          "issuerUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "required": [
          "issuerUrl",
          "clientId",
          "clientSecret"
        ],
        "type": "object"
      },
      "SaveOidcConnectionResult": {
        "properties": {
          "connection": {
            "$ref": "#/components/schemas/OidcConnectionReadback"
          },
          "policy": {
            "$ref": "#/components/schemas/TenantLoginPolicy"
          }
        },
        "required": [
          "policy",
          "connection"
        ],
        "type": "object"
      },
      "SaveParablePreferenceInput": {
        "description": "Save one setting for a Pane. `expectedRevision` 0 creates the setting and\nfails if one exists; any other revision replaces the value that revision\nread. `shared` saves it for This Parable instead of the person; `group`, with\n`shared`, saves it for that group, by the group's id from the Parable's own\ndata (PARABLE-5635).",
        "properties": {
          "expectedRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "group": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "message": {
            "maxLength": 500,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "name": {
            "nullable": true,
            "type": "string"
          },
          "paneKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "release": {
            "description": "For a Versioned setting (PARABLE-5721): the number the new Version takes\nwhen the save publishes one, minor unless major is asked for, and the\nVersion's description. A Live setting ignores both.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ParableReleaseLevelEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "shared": {
            "type": "boolean"
          },
          "value": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          }
        },
        "required": [
          "paneKey",
          "handle",
          "shared",
          "value",
          "expectedRevision"
        ],
        "type": "object"
      },
      "SaveParablePrimaryInput": {
        "additionalProperties": false,
        "properties": {
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedRefVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "pkg": {
            "$ref": "#/components/schemas/ParableDraftEntityPackage"
          }
        },
        "required": [
          "expectedRefVersion",
          "expectedAggregateRevision",
          "pkg"
        ],
        "type": "object"
      },
      "SaveParablePrimaryResult": {
        "properties": {
          "package": {
            "$ref": "#/components/schemas/ParableEffectivePackageRead"
          },
          "perceptionSourceReceipts": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ParablePerceptionSourceReceipt"
            },
            "nullable": true,
            "type": "object"
          },
          "plotDiagnostics": {
            "description": "See SaveParableProposalResult.plotDiagnostics.",
            "items": {
              "$ref": "#/components/schemas/PlotValidationRecordView"
            },
            "type": "array"
          },
          "primary": {
            "$ref": "#/components/schemas/ParablePrimaryView"
          },
          "sourceLint": {
            "description": "See SaveParableProposalResult.sourceLint.",
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintView"
            },
            "type": "array"
          }
        },
        "required": [
          "primary",
          "package",
          "plotDiagnostics",
          "sourceLint"
        ],
        "type": "object"
      },
      "SaveParableProposalInput": {
        "additionalProperties": false,
        "properties": {
          "expectedRefVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "pkg": {
            "$ref": "#/components/schemas/ParableDraftEntityPackage"
          }
        },
        "required": [
          "expectedRefVersion",
          "pkg"
        ],
        "type": "object"
      },
      "SaveParableProposalResult": {
        "properties": {
          "perceptionSourceReceipts": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ParablePerceptionSourceReceipt"
            },
            "description": "Exact input/normalized-output pair from the committed write, never a later read.",
            "nullable": true,
            "type": "object"
          },
          "plotDiagnostics": {
            "description": "One entry per PLOT_SQL implementation this save validated. Empty when the\npackage carried none, or when every Plot's code hash still matched its\nrecorded diagnostics and validation was skipped.\nA save with outstanding diagnostics is still a successful save: the write\nlands, the response is a 200, and the gate is publication rather than save\n(spec 0084 \"Severity policy\").\nIt used to say \"the command receipt completes\", and no receipt was ever\nminted here (PARABLE-3247). The save is not a command in the ledger's\nsense: it is CAS-guarded by expectedRefVersion and expectedAggregateRevision,\nso a repeat is refused by the token it carries rather than by an idempotency\nkey, and its refusals travel on ParableAuthoringError. Diagnostics are what\nthis response reports; nothing about them is recorded on a receipt.",
            "items": {
              "$ref": "#/components/schemas/PlotValidationRecordView"
            },
            "type": "array"
          },
          "proposal": {
            "$ref": "#/components/schemas/ParableProposalRecordView"
          },
          "sourceLint": {
            "description": "Lint for every linted implementation of the revision this save wrote, so an\nagent learns at once whether its edit introduced problems. Like\nplotDiagnostics, problems never refuse the save.",
            "items": {
              "$ref": "#/components/schemas/ParableSourceLintView"
            },
            "type": "array"
          }
        },
        "required": [
          "proposal",
          "plotDiagnostics",
          "sourceLint"
        ],
        "type": "object"
      },
      "SaveSamlConnectionInput": {
        "properties": {
          "certificate": {
            "description": "IdP X.509 signing certificate, PEM encoded. Write-only.",
            "type": "string"
          },
          "displayName": {
            "nullable": true,
            "type": "string"
          },
          "identityProvider": {
            "$ref": "#/components/schemas/SamlIdentityProvider"
          },
          "idpEntityId": {
            "description": "IdP Entity ID -- a URI, not necessarily a resolvable URL, so Network.Uri\n(any scheme) rather than Network.Url.",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "idpSsoUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "required": [
          "identityProvider",
          "idpEntityId",
          "idpSsoUrl",
          "certificate"
        ],
        "type": "object"
      },
      "SaveSamlConnectionResult": {
        "properties": {
          "connection": {
            "$ref": "#/components/schemas/SamlConnectionReadback"
          },
          "policy": {
            "$ref": "#/components/schemas/TenantLoginPolicy"
          }
        },
        "required": [
          "policy",
          "connection"
        ],
        "type": "object"
      },
      "ScheduledPlotRecompute": {
        "description": "The Workspace's scheduled Plots a new SQL default reaches (PARABLE-4727):\nthe Plots its Plot schedules and enabled Report plans run, each counted\nonce, read from their published SQL by the query layer.",
        "properties": {
          "plots": {
            "description": "Plots with a call that names no model. Their next run resolves the new\ndefault, gets a new binding digest and recomputes.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "possiblePlots": {
            "description": "Jev only: Plots whose Jev model comes from a column or expression, so\nrows where it is NULL run the new default. Always 0 for SQL_MODEL.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "plots",
          "possiblePlots"
        ],
        "type": "object"
      },
      "ScheduledReportCaptureOutcome": {
        "description": "What web-api did with one scheduled Report plan fire that query-runner asked\nit to capture (PARABLE-4447).",
        "enum": [
          "CAPTURED",
          "ALREADY_CAPTURED",
          "REFUSED",
          "STALE",
          "SKIPPED_IN_FLIGHT"
        ],
        "type": "string"
      },
      "ScheduledReportCaptureRefusal": {
        "description": "Why web-api refused to capture a scheduled Report run (PARABLE-4447). Each\nrefusal is recorded on the plan as a consecutive failure with a pause reason.",
        "enum": [
          "PROTECTION_DENIED",
          "ACTION_REFUSED",
          "PROTECTION_FILTERS_UNSUPPORTED",
          "REPORT_NOT_FOUND",
          "VERSION_NOT_PUBLISHED",
          "REPORT_HAS_NO_PLOTS",
          "REPORT_MEMBER_DEPENDENCY",
          "PINNED_REFRESH_EXPIRED"
        ],
        "type": "string"
      },
      "SearchAvailableDataInput": {
        "description": "A search of the data the caller may query, by the words a table's or a\ncolumn's name and description would use, or, with an empty query, a\nlisting of the tables they may query.",
        "properties": {
          "cursor": {
            "description": "The nextCursor of the listing page before, to read the next one. Null\nstarts a listing at its first table. A search takes none.",
            "maxLength": 1500,
            "nullable": true,
            "type": "string"
          },
          "kind": {
            "description": "Null returns tables and columns. A listing returns tables only.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/AvailableDataKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "limit": {
            "description": "Results per page, 1 to 100. Null means 20 in a search and 100 in a listing.",
            "format": "int64",
            "maximum": 100,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "offset": {
            "description": "Results to skip in a search, which ranks at most 500. Null means 0. A\nlisting pages with cursor instead.",
            "format": "int64",
            "maximum": 499,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "query": {
            "description": "Plain text describing the data, such as `open issues and who they are\nassigned to`. Empty or `*` lists the Provider Pool instead of searching\nit: each Provider with its table count, or with a scope such as\n`providers.jiracloud`, that Provider's tables.",
            "maxLength": 1000,
            "type": "string"
          },
          "scope": {
            "description": "A pattern over names that narrows the search before ranking, one dotted\nsegment at a time: `providers.jiracloud` is one Provider,\n`providers.jiracloud.issues.*` the columns of one table, `providers.*.issues`\nthe tables named issues in every Provider. Null searches every Pool the\ncaller may query. A listing takes no scope, to list the Providers, or one\nProvider by name, to list its tables.",
            "maxLength": 500,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "SearchAvailableDataResult": {
        "properties": {
          "limit": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "matches": {
            "description": "Best first in a search; in a listing, one Provider's tables by name.\nFewer than `limit` in a search means it has no more results.",
            "items": {
              "$ref": "#/components/schemas/AvailableDataMatch"
            },
            "type": "array"
          },
          "nextCursor": {
            "description": "A listing with more tables: send it back as cursor for the next page.\nNull on a listing's last page and in a search.",
            "nullable": true,
            "type": "string"
          },
          "offset": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "providers": {
            "description": "A listing with no scope: every Provider the caller may query, by scope,\nwith its table count. Empty otherwise.",
            "items": {
              "$ref": "#/components/schemas/AvailableDataProvider"
            },
            "type": "array"
          }
        },
        "required": [
          "matches",
          "providers",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "SearchParableProblemMessagePowersInput": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 25,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "maxLength": 200,
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ParableProblemMessageToolScope"
          }
        },
        "required": [
          "scope",
          "query",
          "limit"
        ],
        "type": "object"
      },
      "SearchParableProblemMessagePowersResult": {
        "description": "Front matter only; a Power's instructions are read separately.",
        "properties": {
          "matches": {
            "items": {
              "$ref": "#/components/schemas/AgentSkillSummary"
            },
            "maxItems": 25,
            "minItems": 0,
            "type": "array"
          },
          "total": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "matches",
          "total"
        ],
        "type": "object"
      },
      "SearchParableProblemRunPowersInput": {
        "additionalProperties": false,
        "description": "A durable Run searching its Workspace's Power shelf (EDR-0092 spec 2.3,\nPARABLE-5050). As with the Run's Pings, the Run's sealed proof is the scope:\nweb-api searches the shelf of the Workspace sealed into the Run, as the\nperson who started it. The answer is SearchParableProblemMessagePowersResult,\nthe shape the Message-scoped search answers with.",
        "properties": {
          "dispatchSnapshotDigest": {
            "description": "The sealed digest the step holds; refused when it is not the Run's.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "limit": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 25,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "maxLength": 200,
            "type": "string"
          }
        },
        "required": [
          "dispatchSnapshotDigest",
          "query",
          "limit"
        ],
        "type": "object"
      },
      "SemanticCatalogField": {
        "description": "SRV-2 (PARABLE-296): the runtime-computed logical catalog served as\npsgen / ParableSchema semantic types. This REST projection includes permitted\nArtifact tables; it and Flight SQL metadata derive from the same computation\n(`ProviderCatalog::build`); the field-for-key mapping lives in\nservices/query-layer/src/metadata_contract.rs. Pool addressing is\ndocs/edrs/0080-three-pool-data-catalog.mdx.\n\nNull / unknown semantics follow the metadata contract: an omitted\n(null) annotation field means *unknown / not yet computed*; a present\nvalue is authoritative. Identity fields (tableKind, tapKind,\ncontractVersion) are always present.\nOne logical column of a served table or view.",
        "properties": {
          "arrowType": {
            "description": "Deterministic Arrow DataType rendering (Arrow's canonical Display\nform). Deliberately a string, not an enum: nested and parameterized\ntypes render their full parameters (`List(Field { .. Utf8 .. })`,\n`Timestamp(Nanosecond, Some(\"UTC\"))`, `Map(...)`), so the value set\nis open -- it is the exact type served in the Flight IPC schema for\nthe same column, which an enum of type families could not carry.",
            "type": "string"
          },
          "hidden": {
            "description": "True on internal/ops columns deliberately exposed in the logical\nschema (quarantine `_parable_*` envelope columns). Main-table\nenvelope columns are excluded from the schema entirely, not flagged.",
            "type": "boolean"
          },
          "name": {
            "description": "Logical column name (lowercased source path segments joined with\n`__`), exactly as served by Flight GetTables.",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "nullable": {
            "type": "boolean"
          },
          "poorPruning": {
            "description": "True on columns whose physical representation defeats data skipping\n(JSON-encoded, native struct/array, capture buckets). Mirrors the\nFlight `parable.annotation.poor_pruning` field metadata key.",
            "type": "boolean"
          },
          "scalarRef": {
            "description": "Canonical name of the column's semantic scalar (e.g. `Contact.Email`),\nexactly the Flight `parable.scalar.canonical_name` field metadata\nvalue; null when the column carries no semantic scalar. Consumers\nneeding a JSON-Schema pointer can prefix `#/definitions/scalars/`.",
            "maxLength": 128,
            "minLength": 3,
            "nullable": true,
            "pattern": "^[A-Z][A-Za-z0-9]*\\.[A-Z][A-Za-z0-9]*$",
            "type": "string"
          },
          "system": {
            "description": "True on the row-state columns Parable adds to every Provider table:\n`dt` and the `_parable_*` load and deletion columns on main and child\ntables, and the `_parable_*` envelope plus `dt` on quarantine tables.\nThey stay queryable; catalog browsers list them apart from the\nProvider's own fields. Mirrors the Flight `parable.annotation.system`\nfield metadata key.\n\n`GET /api/v2/catalog` always sets it. The CatalogSnapshot omits it (null):\nthe Plot validator does not read it, and the browser's validator parses\nthis type with unknown fields denied, so a snapshot carrying it would fail\nin an editor still running the previous release.",
            "nullable": true,
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "arrowType",
          "nullable",
          "hidden",
          "poorPruning"
        ],
        "type": "object"
      },
      "SemanticCatalogForeignKey": {
        "description": "An imported foreign key from this table to another served table.",
        "properties": {
          "referencedColumns": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "referencedSchema": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "referencedTable": {
            "type": "string"
          },
          "sourceColumns": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "sourceColumns",
          "referencedSchema",
          "referencedTable",
          "referencedColumns"
        ],
        "type": "object"
      },
      "SemanticCatalogPrimaryKey": {
        "description": "Ordered logical columns forming a table's primary key.",
        "properties": {
          "columns": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "columns"
        ],
        "type": "object"
      },
      "SemanticCatalogResponse": {
        "description": "The tenant's semantic catalog.",
        "properties": {
          "catalogVersion": {
            "description": "Structure-only catalog fingerprint (planner version + plans +\nprovider roots + views). Data movement never bumps it; clients may\nkey caches on (tenantSlug, catalogVersion).",
            "type": "string"
          },
          "contractVersion": {
            "description": "Catalog metadata contract version (`parable.metadata.contract_version`).",
            "type": "string"
          },
          "tables": {
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogTable"
            },
            "type": "array"
          },
          "tenantSlug": {
            "description": "Tenant the catalog belongs to (from the request; SYSTEM-1782). Same\ntype as Tenant.slug, the field it references.",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "views": {
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogView"
            },
            "type": "array"
          }
        },
        "required": [
          "tenantSlug",
          "catalogVersion",
          "contractVersion",
          "tables",
          "views"
        ],
        "type": "object"
      },
      "SemanticCatalogTable": {
        "description": "One served base table.",
        "properties": {
          "catalog": {
            "description": "DataFusion catalog the table registers under (`providers`,\n`providers_quarantine`, or `providers_quality`). Quarantine mirrors and\nquality history siblings share connector schema naming with their\nprovider table; the catalog carries meaning.",
            "type": "string"
          },
          "description": {
            "description": "What the table holds, from the Provider's description of the Tap or its\ndocumentation (PARABLE-4945). Null when neither describes it. The\nCatalogSnapshot omits it, for the reason given on\nSemanticCatalogField.system.",
            "nullable": true,
            "type": "string"
          },
          "fields": {
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogField"
            },
            "type": "array"
          },
          "importedForeignKeys": {
            "description": "Foreign keys imported by this table. Empty when none are resolved.",
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogForeignKey"
            },
            "type": "array"
          },
          "logicalName": {
            "description": "Logical table name inside the connector schema.",
            "type": "string"
          },
          "materialized": {
            "description": "Whether the writer has materialized the physical table. Null until\nan annotation source answers (unknown, never false-by-default).",
            "nullable": true,
            "type": "boolean"
          },
          "primaryKey": {
            "description": "Ordered logical columns for the table's primary key. Null when the\nplanner does not expose a complete primary key.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SemanticCatalogPrimaryKey"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "schemaName": {
            "description": "Catalog SCHEMA SEGMENT the table registers under. For the providers\ncatalogs it is a connector slug sanitized for SQL identifiers (`-`\nbecomes `_`, e.g. `google-drive` registers as `google_drive`); for the\nderived identity-resolution family it is the literal `identity`; for the\nartifacts it is the publication namespace (`public` for legacy uploads);\nthe workspace catalog keeps the literal `public`.\n\nIdentity.Slug, not Connector.Slug (PARABLE-3260). Connector.Slug reserves\n`identity` and `artifacts`, but that reservation is a CONNECTOR\nREGISTRATION rule (PARABLE-447 / PARABLE-286) and was never a rule about\ncatalog schema segments. Identity.Slug accepts every value Connector.Slug\naccepts, so the retype is a pure widening on the wire.",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "statsRowCount": {
            "description": "Row count from the annotation source; null when unknown.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "tableKind": {
            "$ref": "#/components/schemas/CatalogTableKindEnum",
            "description": "Position in the tap's plan; Flight `parable.annotation.table_kind`."
          },
          "tapKind": {
            "$ref": "#/components/schemas/CatalogTapKindEnum",
            "description": "Catalog tap-kind vocabulary (EDR-0021 kinds plus `derived` for\nplatform-synthesized families); Flight `parable.annotation.tap_kind`."
          },
          "validationRates": {
            "description": "Per-column validation rates keyed by logical column name. Empty when\nno annotation source answered.",
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogValidationRate"
            },
            "type": "array"
          },
          "watermark": {
            "description": "Completeness watermark (\"complete through T\"); null when unknown.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "watermarkStale": {
            "nullable": true,
            "type": "boolean"
          }
        },
        "required": [
          "catalog",
          "schemaName",
          "logicalName",
          "tableKind",
          "tapKind",
          "validationRates",
          "importedForeignKeys",
          "fields"
        ],
        "type": "object"
      },
      "SemanticCatalogValidationRate": {
        "description": "Per-column validation rate (logical column name -\u003e rate string), from\nthe Flight `parable.annotation.validation_rate.{column}` keys.",
        "properties": {
          "column": {
            "type": "string"
          },
          "rate": {
            "type": "string"
          }
        },
        "required": [
          "column",
          "rate"
        ],
        "type": "object"
      },
      "SemanticCatalogView": {
        "description": "One opt-in convenience view (LOG-3). The output schema is a planning\nproduct resolved from the tenant session at request time, exactly as\nFlight GetTables serves it.",
        "properties": {
          "fields": {
            "items": {
              "$ref": "#/components/schemas/SemanticCatalogField"
            },
            "type": "array"
          },
          "logicalName": {
            "type": "string"
          },
          "schemaName": {
            "description": "Views register under their parent table's schema segment, same type and\nsame value rule as SemanticCatalogTable.schemaName.",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "schemaName",
          "logicalName",
          "fields"
        ],
        "type": "object"
      },
      "SendInviteCodeInput": {
        "description": "Email a new invite code. Any address may redeem it; the address is kept\nonly so the sender can see where it went.",
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "SendMagicLinkInput": {
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "returnTo": {
            "description": "Optional post-auth landing URL captured from the original `?return=`\nquery parameter on /login. The backend persists this on the magic-link\nrow and surfaces it as AuthPayload.redirectTo when the token is\nconsumed, so the user lands on the page they originally tried to reach\n(e.g. a tenant deep-link).\n## Why `String` and not the `Url` scalar\nThis was a deliberate choice during the auth-surface refactor -- the\n`Url` scalar is the right tool for fields that carry an external,\ncanonicalizable absolute URL (see `organizationWebsite: Url` below for\nthe canonical example), and the wrong tool here for three independent\nreasons:\n1. **Value shape mismatch.** The common-case payload for `returnTo` is\na *relative path* like `/vendors/123` or `/admin?tab=members`, not\nan RFC-3986 absolute URL. The `Url` scalar's parser rejects those\n-- it requires scheme + authority. Loosening the scalar to also\naccept relative paths would dilute its meaning everywhere else it\nis used (organization websites, OAuth callbacks, webhook URLs).\n2. **Validation is config-dependent.** The real check is \"does this\nURL land on a host this deployment is allowed to redirect to,\"\nwhich depends on `BASE_DOMAIN` at runtime (`app.parable.work` vs\n`app.staging.parable.work` vs `localhost`). That logic lives in\n`validateReturnTo` server-side. A scalar cannot read env vars at\nparse time, so the gate it provides would be strictly weaker than\nwhat the BFF is already doing -- and worse, would create the\nillusion that an accepted value is safe to redirect to.\n3. **No FE-visible oracle.** When `validateReturnTo` rejects a value,\nthe backend silently drops it (`AuthPayload.redirectTo` falls back\nto the flow default) instead of 400'ing. Using `Url` would force a\nsynchronous 400 at the API boundary, which (a) gives an attacker a\nside-channel for probing the host-suffix policy from the unauthed\nsurface and (b) couples a UX-visible error path to a defense-in-\ndepth check that is meant to be invisible to legitimate clients.\nNet: leave the scalar as plain `String`; the semantic guard is\n`validateReturnTo`. If the validator ever needs to surface specific\nfailures to the FE (e.g. for a power-user \"where did my deep link\ngo?\" affordance), do that as a non-error signal on `AuthPayload`, not\nby tightening this input scalar.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "SentInviteCode": {
        "description": "A code the signed-in person just sent. `code` is the full code, formatted as\n\"K7QM-4XRA\", returned only here so it can be shared if the email fails.",
        "properties": {
          "code": {
            "type": "string"
          },
          "emailSent": {
            "description": "True when the invite email was handed to the mail provider.",
            "type": "boolean"
          },
          "invite": {
            "$ref": "#/components/schemas/MyInviteCodeView"
          }
        },
        "required": [
          "code",
          "invite",
          "emailSent"
        ],
        "type": "object"
      },
      "Session": {
        "description": "A users session",
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "ipAddress": {
            "description": "IP address from which the session was created",
            "nullable": true,
            "type": "string"
          },
          "isCurrent": {
            "description": "Whether this is the current session making the request",
            "type": "boolean"
          },
          "isImpersonating": {
            "description": "Whether this session is an impersonation session (FTE acting as another user).",
            "type": "boolean"
          },
          "jti": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lastActiveAt": {
            "description": "When the session was last used for an authenticated request",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "userAgent": {
            "description": "User agent string from the client that created this session",
            "nullable": true,
            "type": "string"
          },
          "userId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "jti",
          "createdAt",
          "updatedAt",
          "expiresAt",
          "userId",
          "isCurrent",
          "isImpersonating"
        ],
        "type": "object"
      },
      "SessionPagePaginationConfig": {
        "description": "Configuration for Mixpanel-style session_id + page pagination.",
        "properties": {
          "defaultPageSize": {
            "description": "Default page size used to detect the last page",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "pageParam": {
            "description": "Query/body parameter name for page (default: 'page')",
            "nullable": true,
            "type": "string"
          },
          "pagePath": {
            "description": "JMESPath to extract the current page from the response",
            "nullable": true,
            "type": "string"
          },
          "sessionIdParam": {
            "description": "Query/body parameter name for session id (default: 'session_id')",
            "nullable": true,
            "type": "string"
          },
          "sessionIdPath": {
            "description": "JMESPath to extract session id from the response",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "defaultPageSize"
        ],
        "type": "object"
      },
      "SetApiTokensEnabledInput": {
        "description": "Input for turning personal access tokens on or off in the selected\nWorkspace.",
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "SetLoginMethodsInput": {
        "properties": {
          "allowedMethods": {
            "items": {
              "$ref": "#/components/schemas/LoginMethodEnum"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "allowedMethods"
        ],
        "type": "object"
      },
      "SetModelPreferencesInput": {
        "description": "Replaces a Workspace's part of its model policy (PARABLE-4670): the\nprocessors it switches off and its default model per capability. An empty\nlist clears either one.",
        "properties": {
          "capabilityDefaults": {
            "description": "At most one default per capability, only for the capabilities a Workspace\nmay set: chat, SQL_MODEL, SQL_JEV, SCHEMA_INFERENCE, PONDER_CLEANUP,\nPONDER_NAMING, PONDER_JUDGMENT and PONDER_LANGUAGE.",
            "items": {
              "$ref": "#/components/schemas/ModelCapabilityDefault"
            },
            "maxItems": 16,
            "type": "array"
          },
          "disabledProcessors": {
            "description": "Processors to switch off. Each must be within the staff ceiling when one\nis set.",
            "items": {
              "$ref": "#/components/schemas/ModelProcessor"
            },
            "maxItems": 16,
            "type": "array"
          }
        },
        "required": [
          "disabledProcessors",
          "capabilityDefaults"
        ],
        "type": "object"
      },
      "SetParableCollaborationModeInput": {
        "properties": {
          "collaborationMode": {
            "$ref": "#/components/schemas/ParableCollaborationModeEnum"
          },
          "expectedAggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expectedRootRefVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "collaborationMode",
          "expectedAggregateRevision",
          "expectedRootRefVersion"
        ],
        "type": "object"
      },
      "SetParableCollaborationModeResult": {
        "properties": {
          "aggregateRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "collaborationMode": {
            "$ref": "#/components/schemas/ParableCollaborationModeEnum"
          },
          "proposalId": {
            "description": "The caller's Pending Changes on a Parable in Publishing mode, when they\nhold some. The switch to Publishing opens no set (PARABLE-6851). Outside a\nPonder turn this is the caller's newest Pending set. Inside a turn it is\nthe current Problem's set, when the caller authored it and it is Pending.\nOtherwise it is null. So it is null in the root Problem, in a Pocketed\nProblem and in a Problem about another Parable. It is null too when the\nProblem's set is someone else's or no longer Pending.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "sourceRefId": {
            "description": "The draft ref of the set proposalId names. Null when proposalId is null.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "collaborationMode",
          "aggregateRevision",
          "refRevision"
        ],
        "type": "object"
      },
      "SetPlatformParableInput": {
        "description": "Input for setPlatformParable (PARABLE-6986): Admin's Platform switch.\nA Platform Parable is deployed to every Workspace, including Workspaces\ncreated later, and it is the only kind of Parable whose Plots other\nParables may read. Visible stays the only per-Workspace control. Turning\nit off is refused with PLATFORM_PARABLE_READ_BY_PARABLES while other\nParables' published Versions read it.",
        "properties": {
          "expectedCommitId": {
            "description": "On: the published Version to deploy to every Workspace, the one the source\nline serves now. Null when the Parable has no published Version yet: its\nfirst Deploy reaches every Workspace. Ignored when the switch turns off.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "idempotencyKey": {
            "description": "Replays of the same key return the same result, as a Deploy's does.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "platformParable": {
            "description": "The switch's new position. Sending the current position changes nothing.",
            "type": "boolean"
          }
        },
        "required": [
          "platformParable",
          "idempotencyKey"
        ],
        "type": "object"
      },
      "SetPlatformParableResult": {
        "description": "Result of setPlatformParable (PARABLE-6986).",
        "properties": {
          "platformParable": {
            "description": "The switch's position after the call.",
            "type": "boolean"
          },
          "readers": {
            "description": "The Parables whose published Versions read this one. Platform cannot turn\noff while this list has any.",
            "items": {
              "$ref": "#/components/schemas/ParablePlatformReaderView"
            },
            "type": "array"
          },
          "rolloutId": {
            "description": "The Rollout that took the Version to every Workspace, when turning the\nswitch on deployed one. Null otherwise.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "platformParable",
          "readers"
        ],
        "type": "object"
      },
      "SetPonderChatModelOrderInput": {
        "additionalProperties": false,
        "description": "A Workspace's whole offer order: the list order is the order the picker\noffers. It replaces the stored order.",
        "properties": {
          "entries": {
            "items": {
              "$ref": "#/components/schemas/PonderChatModelOrderEntry"
            },
            "maxItems": 2000,
            "type": "array"
          }
        },
        "required": [
          "entries"
        ],
        "type": "object"
      },
      "SetPonderPowerToolsInput": {
        "description": "The complete set of tools a Power uses; the server stores it as changes over the built-in defaults.",
        "properties": {
          "expectedMembershipDigest": {
            "description": "The membershipDigest the editor loaded. A save over a newer change is refused with a conflict.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "toolHandles": {
            "description": "Generated tool handles; an unknown or hidden handle is refused.",
            "items": {
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "toolHandles",
          "expectedMembershipDigest"
        ],
        "type": "object"
      },
      "SetPonderSummarizeSettingInput": {
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "SetPonderWorkspaceToolPolicyInput": {
        "properties": {
          "policy": {
            "description": "Null removes the Workspace override and restores the operation default.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderPersonaToolPolicyEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "toolHandle": {
            "maxLength": 48,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "toolHandle"
        ],
        "type": "object"
      },
      "SetProductParableBuiltByParableProsInput": {
        "description": "Shared input for Admin and Workspace attribution: the settled value of the\nParable Pros toggle. Sending the current value is a no-op.",
        "properties": {
          "builtByParablePros": {
            "type": "boolean"
          }
        },
        "required": [
          "builtByParablePros"
        ],
        "type": "object"
      },
      "SetProviderPolicyInput": {
        "description": "Replaces one table's Provider Policy. A definition with no rules and\nEveryone else at All rows clears it; the row and its history stay.",
        "properties": {
          "definition": {
            "$ref": "#/components/schemas/ProviderPolicyDefinition"
          },
          "expectedRevision": {
            "description": "The revision the change starts from: 0 for a table with no Provider\nPolicy yet. Another save in between refuses this one.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "expectedRevision",
          "definition"
        ],
        "type": "object"
      },
      "SetPulseCapturePolicyInput": {
        "description": "Replaces a Workspace's Pulse capture policy (PARABLE-7170).",
        "properties": {
          "skippedBundleIdPrefixes": {
            "description": "The whole list of macOS bundle ID prefixes Pulse skips. An empty list\nleaves only the built-in protected list. Each entry has at least two\ndot-separated parts of letters, digits, and hyphens, as a bundle ID\ndoes, so a one-part entry such as `com` cannot skip almost every app.\nweb-api stores the entries in lower case, sorted, with duplicates\nremoved.",
            "items": {
              "maxLength": 255,
              "pattern": "^[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$",
              "type": "string"
            },
            "maxItems": 200,
            "type": "array"
          }
        },
        "required": [
          "skippedBundleIdPrefixes"
        ],
        "type": "object"
      },
      "SetRefreshCostThresholdInput": {
        "description": "PUT semantics: the field is required, and null returns the Workspace to the\nplatform default.",
        "properties": {
          "threshold": {
            "description": "US cents.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "SetScimDefaultRoleInput": {
        "description": "Sets (or clears) the tenant's default provisioning role -- the role granted to\nSCIM/JIT-provisioned users that arrive with no roles. Null clears it. A tenant\nadmin must configure this before SSO can be activated (SSO_DEFAULT_ROLE_REQUIRED).",
        "properties": {
          "scimDefaultRoleId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "SetSourcePermissionsInput": {
        "additionalProperties": false,
        "description": "Replaces a Workspace's source permissions settings. Both settings are\nrequired: a save that leaves one out is refused rather than turning it off.",
        "properties": {
          "enforced": {
            "type": "boolean"
          },
          "expectedRevision": {
            "description": "The revision the change starts from: 0 for a Workspace that never saved\nthe settings. Another save in between refuses this one.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "linkOnlyGrantsAdmit": {
            "type": "boolean"
          }
        },
        "required": [
          "expectedRevision",
          "enforced",
          "linkOnlyGrantsAdmit"
        ],
        "type": "object"
      },
      "SetUserAvatarInput": {
        "description": "Profile-picture upload for the current user. `avatar` is a multipart image\n(image/jpeg|png|gif|webp, \u003c=2MB per the Asset.Image scalar); the server uploads\nit to GCS and stores the full Asset.Image metadata (assetId, url, mime type,\nsize, dimensions, filename) on User.avatar. The API returns just the CDN url.",
        "properties": {
          "avatar": {
            "description": "Image metadata",
            "type": "object"
          }
        },
        "required": [
          "avatar"
        ],
        "type": "object"
      },
      "SetUserAvatarResult": {
        "description": "Result of setUserAvatar: the new avatar CDN URL, mapped from the Asset.Image\nmetadata persisted on the user.",
        "properties": {
          "avatarUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "required": [
          "avatarUrl"
        ],
        "type": "object"
      },
      "SetWorkspaceParableIdentityInput": {
        "description": "Input for setWorkspaceParableIdentity (PARABLE-1618): the Workspace half of\nadmin's renameProductParable / setProductParableIdentity pair. Send only what\nis changing; a field that is absent is left alone.\n\n# Why this is not the package save\n\nA Workspace already writes its Parable through the package save, but a Parable's\nown identity is not a Piece: `ParableDetails` carries `title` and `summary` on\nthe wire and deliberately not `handle` or `icon`, and `ParablePrimaryView.Label`\nis read off `product_parable`. So identity needs its own declaration rather\nthan a widened package.\n\n# Handle regeneration, and where it disagrees with admin\n\nAdmin's rename deliberately leaves the handle alone (see\nRenameProductParableInput): an admin handle is read back as an identifier in\ngenerated TS/Swift/Rust and in exported paths, so churning it breaks code. A\nWorkspace Parable is not imported that way, and PARABLE-1618 asks for the\nhandle to follow the name, so `name` with no `handle` regenerates through\nscalar-lib and uniquifies within the Workspace. Sending `handle` explicitly\npins it and skips regeneration, which is the escape hatch for a caller that\nhas a reason to keep one.\n\nA Workspace is one namespace for Parable handles, so regeneration can still\nlose: the refusal is PA-AU-024, the same code Publish answers with.\n\n# Absent and null are different answers\n\nAbsent leaves a field alone. Explicit null is a value in its own right and\neach field below says what it means, because a reader clearing a mark and a\nreader not mentioning it are two different requests. Clearing is the whole\nreason null is spelled out: a server that reads them as the same thing\nanswers \"cleared\" with a no-op 200, which is the dead control PARABLE-1469\nexists to remove.",
        "properties": {
          "description": {
            "description": "Lands on `ParableDetails.summary`, which is the Parable's own description.\nExplicit null clears it, the same way null clears the mark.",
            "nullable": true,
            "type": "string"
          },
          "expectedRefVersion": {
            "description": "Compare-and-swap token for the addressed Primary. Omit it to accept whatever\nversion the surface is on when the write runs; the Parable-wide write lock\nstill serializes it against concurrent saves.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "handle": {
            "description": "Null is refused with a 400, matching admin's setProductParableIdentity: a\nParable with no handle has no readable URL. Leave the field out to have the\nhandle follow the name.",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "description": "A serialized icon spec -- `Parable.Icon` owns the grammar. Explicit null\nclears it back to the default mark, matching the admin contract.",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "name": {
            "description": "Null is refused with a 400: a Parable with no name has nothing to show in a\nlist. Leave the field out to keep the current name.",
            "nullable": true,
            "type": "string"
          },
          "previewSvg": {
            "description": "The Parable's preview (PARABLE-6308): one SVG document, 1280 x 608, that\ndraws in light and dark (structure-design-parable-previews). The server\nrefuses anything but a plate drawn with basic shapes, paths, groups,\npatterns and styles, and names the rule. Explicit null removes it.",
            "maxLength": 32768,
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "SetWorkspaceParableIdentityResult": {
        "description": "Returns the re-read Primary so the caller picks up the projected Label, the\nadvanced ref revision and the capability flags in one round trip, rather than\nechoing back what it just sent.",
        "properties": {
          "primary": {
            "$ref": "#/components/schemas/ParablePrimaryView"
          }
        },
        "required": [
          "primary"
        ],
        "type": "object"
      },
      "SignupTenantInput": {
        "description": "Self-serve tenant signup. Backend slugifies companyName server-side; client\nsends the raw display name. Email + company name are required; the profile\nfields are optional so a stripped-down client (or a future API consumer) can\nsign up without them.\nProfile fields drive two things server-side:\n- user.name is composed as \"firstName lastName\" when both are present,\ninstead of the email-localpart fallback.\n- tenant.slug is always derived from companyName via\nNormalizeParableSlugBase + a 4-digit collision suffix. The user does\nnot pick the subdomain; the FE shows a read-only preview only.\n- organizationWebsite / organizationSize land on tenant; workFunction /\nworkRole land on user. All four are kept for cohort analytics.",
        "properties": {
          "companyName": {
            "description": "Display name; capped at 64 chars at the input edge so it fits the\ntenant.name varchar(80) column even after future suffixes / slugifier\nprefixes, and so the UI can rely on a stable ceiling.",
            "maxLength": 64,
            "minLength": 2,
            "type": "string"
          },
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "firstName": {
            "description": "First name as typed in the signup form. Combined with lastName on confirm\nto seed user.name.",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "lastName": {
            "description": "Last name as typed in the signup form. Combined with firstName on confirm\nto seed user.name.",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "organizationSize": {
            "description": "Headcount bucket chosen at signup. Persisted on tenant.organizationSize.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/OrganizationSize"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "organizationWebsite": {
            "description": "Customer-owned organization website. Persisted on tenant.websiteUrl when\nthe eventual tenant row is created.",
            "format": "uri",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "returnTo": {
            "description": "Optional post-auth landing URL. Same shape, contract, scalar choice\n(plain `String`, not `Url` -- see SendMagicLinkInput.returnTo for the\nfull rationale), and validator as SendMagicLinkInput.returnTo --\npersisted on pending_tenant_signup and surfaced as\nAuthPayload.redirectTo when the confirm token is consumed.",
            "nullable": true,
            "type": "string"
          },
          "workFunction": {
            "description": "Functional area of the signing-up user. Persisted on user.workFunction.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/WorkFunction"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "workRole": {
            "description": "Seniority of the signing-up user. Persisted on user.workRole.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/WorkRole"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "required": [
          "email",
          "companyName"
        ],
        "type": "object"
      },
      "SkippedReason": {
        "description": "Why a maintenance run was skipped. Set on TableMaintenanceResult when\naction = NONE.",
        "enum": [
          "DISABLED",
          "THRESHOLD_NOT_MET",
          "LOCK_HELD",
          "UPSTREAM_FAILED"
        ],
        "type": "string"
      },
      "SourceAccountLink": {
        "description": "A source account a Workspace administrator linked to a member\n(PARABLE-7023; spec 0095 \"Admin-confirmed links\"). On each access run the\nmember's login email gets the account's tokens, as through an exact\nidentity link, while the member is active and the account is an active\nuser in the Provider.",
        "properties": {
          "confirmedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "confirmedBy": {
            "description": "Who confirmed the link, and when.",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "member": {
            "$ref": "#/components/schemas/SourcePermissionsPerson",
            "description": "The member, with the email of their Parable account."
          },
          "memberActive": {
            "description": "False while the member is not an active member of the Workspace. The\nlink then gives nobody the account's tokens.",
            "type": "boolean"
          },
          "principalKey": {
            "description": "The account's principal key, `user:\u003csource id\u003e`.",
            "type": "string"
          },
          "providerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "providerKey",
          "principalKey",
          "member",
          "memberActive",
          "confirmedBy",
          "confirmedAt"
        ],
        "type": "object"
      },
      "SourceAccountLinks": {
        "description": "The Workspace's live account links, newest first.",
        "properties": {
          "canManage": {
            "description": "Whether the person reading may confirm and remove links.",
            "type": "boolean"
          },
          "links": {
            "items": {
              "$ref": "#/components/schemas/SourceAccountLink"
            },
            "type": "array"
          }
        },
        "required": [
          "links",
          "canManage"
        ],
        "type": "object"
      },
      "SourcePermissionsExplainOutcome": {
        "enum": [
          "readable",
          "not_readable",
          "not_modeled",
          "refused",
          "not_served"
        ],
        "type": "string"
      },
      "SourcePermissionsExplainResponse": {
        "properties": {
          "access": {
            "description": "How source permissions decide the table's rows. Null unless modeled.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SourcePermissionsTableAccess"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "accounts": {
            "description": "The person's accounts in the Provider.",
            "items": {
              "$ref": "#/components/schemas/SourcePermissionsReaderAccount"
            },
            "type": "array"
          },
          "anchorColumn": {
            "nullable": true,
            "type": "string"
          },
          "anchorTableKey": {
            "description": "For an anchored table, its anchor table's key and the column that holds\nthe anchor key.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "outcome": {
            "$ref": "#/components/schemas/SourcePermissionsExplainOutcome"
          },
          "refusal": {
            "description": "Why a read would be refused, for `refused`.",
            "nullable": true,
            "type": "string"
          },
          "tokens": {
            "description": "The row's tokens: for an anchored table, the anchor key's tokens in\nanchor_tokens; for an audience table, its audience.",
            "items": {
              "$ref": "#/components/schemas/SourcePermissionsRowToken"
            },
            "type": "array"
          }
        },
        "required": [
          "outcome",
          "accounts",
          "tokens"
        ],
        "type": "object"
      },
      "SourcePermissionsFreshnessResponse": {
        "description": "Answer of `parable.source_permissions_freshness.v1`, which takes an empty\nbody.",
        "properties": {
          "agingAfterSeconds": {
            "description": "The ages past which a projection is aging and stale, in seconds.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "providers": {
            "description": "Each Provider with a modeled table, by schema name.",
            "items": {
              "$ref": "#/components/schemas/SourcePermissionsProvider"
            },
            "type": "array"
          },
          "served": {
            "description": "Whether the Workspace's catalog serves the access projection. When it\ndoes not, every Provider is not built.",
            "type": "boolean"
          },
          "staleAfterSeconds": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "served",
          "agingAfterSeconds",
          "staleAfterSeconds",
          "providers"
        ],
        "type": "object"
      },
      "SourcePermissionsFreshnessState": {
        "description": "How current one Provider's access projection is. The thresholds are the\nstale monitor's (PARABLE-6154): `aging` past its warning, `stale` past its\ncritical threshold. A read under source permissions still uses an aging or\nstale projection. A Provider that is `not_built` has no projection, so a\nread of its modeled tables under source permissions is refused\n(QL-TN-009).",
        "enum": [
          "current",
          "aging",
          "stale",
          "not_built"
        ],
        "type": "string"
      },
      "SourcePermissionsHold": {
        "description": "One reason a person holds a token.",
        "properties": {
          "depth": {
            "description": "For a membership, the number of membership edges from `via` to the\ntoken; 1 is direct.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/SourcePermissionsHoldKind"
          },
          "through": {
            "description": "For a membership deeper than 1, the group, team or role `via` belongs\nto directly on the way. Null when the projection does not say.",
            "nullable": true,
            "type": "string"
          },
          "via": {
            "description": "The person's token it comes through: the account for an account, a\ndomain or `source_users`; the member for a membership. Null for\neveryone.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "SourcePermissionsHoldKind": {
        "description": "How a person holds a token.",
        "enum": [
          "account",
          "membership",
          "domain",
          "source_users",
          "everyone"
        ],
        "type": "string"
      },
      "SourcePermissionsPerson": {
        "description": "The person a source permissions preview or explanation is about\n(PARABLE-6153): an active member of the Workspace, found by the email they\nsign in with.",
        "properties": {
          "email": {
            "description": "The email they sign in with, which source permissions match to their\naccounts in each Provider.",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "userId": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "userId",
          "email"
        ],
        "type": "object"
      },
      "SourcePermissionsPreviewOutcome": {
        "description": "Why a preview has or has not counted one table.",
        "enum": [
          "counted",
          "refused",
          "timed_out",
          "withheld"
        ],
        "type": "string"
      },
      "SourcePermissionsPreviewTable": {
        "properties": {
          "outcome": {
            "$ref": "#/components/schemas/SourcePermissionsPreviewOutcome"
          },
          "providerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "readable": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "tableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "total": {
            "description": "The table's rows, and the rows source permissions let the person read.\nBoth are 0 unless `outcome` is `counted`.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "providerKey",
          "tableKey",
          "outcome",
          "total",
          "readable"
        ],
        "type": "object"
      },
      "SourcePermissionsProvider": {
        "description": "One Provider whose tables source permissions model.",
        "properties": {
          "ageSeconds": {
            "description": "Now minus computedAt, in whole seconds. 0 when the projection is not\nbuilt: `state` says which.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "computedAt": {
            "description": "When the access job built this Provider's projection. Null when it has\nnot.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "oldestInputAt": {
            "description": "The time of the oldest input sync the projection used.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "providerKey": {
            "description": "The catalog's entity_connector_id, as a Provider Policy names it, and\nthe connector id of the access projection's rows.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "schemaName": {
            "description": "A URL friendly version of a string",
            "maxLength": 255,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/SourcePermissionsFreshnessState"
          },
          "tables": {
            "items": {
              "$ref": "#/components/schemas/SourcePermissionsTable"
            },
            "type": "array"
          }
        },
        "required": [
          "providerKey",
          "schemaName",
          "ageSeconds",
          "state",
          "tables"
        ],
        "type": "object"
      },
      "SourcePermissionsReaderAccount": {
        "description": "One of the person's source accounts in the table's Provider.",
        "properties": {
          "guest": {
            "type": "boolean"
          },
          "primaryEmail": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "principalKey": {
            "type": "string"
          },
          "sourceId": {
            "type": "string"
          }
        },
        "required": [
          "principalKey",
          "sourceId",
          "guest"
        ],
        "type": "object"
      },
      "SourcePermissionsRowToken": {
        "description": "One token that admits readers to the row.",
        "properties": {
          "admits": {
            "description": "Whether the token lets the person read the row: they hold it, and it is\nneither expired nor link-only while the setting is off.",
            "type": "boolean"
          },
          "expiresAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "grants": {
            "items": {
              "$ref": "#/components/schemas/SourcePermissionsTokenGrant"
            },
            "type": "array"
          },
          "held": {
            "description": "Whether the person holds the token, and why.",
            "type": "boolean"
          },
          "holds": {
            "items": {
              "$ref": "#/components/schemas/SourcePermissionsHold"
            },
            "type": "array"
          },
          "linkOnly": {
            "description": "Only link-only grants give it: it admits only while the Workspace's\nlink-only setting is on.",
            "type": "boolean"
          },
          "token": {
            "type": "string"
          }
        },
        "required": [
          "token",
          "linkOnly",
          "held",
          "holds",
          "admits",
          "grants"
        ],
        "type": "object"
      },
      "SourcePermissionsTable": {
        "description": "One table source permissions model, as the catalog's served layouts\nclassify it.",
        "properties": {
          "access": {
            "$ref": "#/components/schemas/SourcePermissionsTableAccess"
          },
          "anchorColumn": {
            "description": "For an anchored table, the column that holds each row's anchor key, as\nthe catalog serves it. A field of a struct column is `column.field`.\nNull for any other table.",
            "nullable": true,
            "type": "string"
          },
          "logicalName": {
            "type": "string"
          },
          "parentTableKey": {
            "description": "For a child table, its main table's key.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tableKind": {
            "$ref": "#/components/schemas/CatalogTableKindEnum"
          }
        },
        "required": [
          "tableKey",
          "logicalName",
          "tableKind",
          "access"
        ],
        "type": "object"
      },
      "SourcePermissionsTableAccess": {
        "description": "How source permissions decide the rows of one modeled table.",
        "enum": [
          "anchored",
          "source_users",
          "unrestricted",
          "unresolved"
        ],
        "type": "string"
      },
      "SourcePermissionsTokenGrant": {
        "description": "One grant behind a token of the row, from providers.access.grants.",
        "properties": {
          "cause": {
            "$ref": "#/components/schemas/AccessGrantCause"
          },
          "level": {
            "$ref": "#/components/schemas/AccessLevel"
          },
          "viaKey": {
            "description": "The row the grant came through, such as the parent of an inherited\ngrant. Null when the grant names the row itself.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "level",
          "cause"
        ],
        "type": "object"
      },
      "SourcePermissionsUnlinkedAccount": {
        "description": "A source user account that holds grants and that no member reads through.",
        "properties": {
          "grants": {
            "description": "The direct and owner grants that name the account, or a group, team or\nrole it belongs to.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "guest": {
            "description": "A guest gets no `source_users` or domain tokens.",
            "type": "boolean"
          },
          "primaryEmail": {
            "description": "The account's primary email in the source. Null when it has none.",
            "format": "email",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "principalKey": {
            "description": "The account's principal key, `user:\u003csource id\u003e`.",
            "type": "string"
          },
          "providerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceId": {
            "type": "string"
          }
        },
        "required": [
          "providerKey",
          "principalKey",
          "sourceId",
          "guest",
          "grants"
        ],
        "type": "object"
      },
      "SourcePermissionsUnlinkedResponse": {
        "properties": {
          "accounts": {
            "description": "The accounts with the most grants first, at most `limit`.",
            "items": {
              "$ref": "#/components/schemas/SourcePermissionsUnlinkedAccount"
            },
            "type": "array"
          },
          "total": {
            "description": "How many unlinked accounts there are in all.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "accounts",
          "total"
        ],
        "type": "object"
      },
      "SpcRuleViolation": {
        "description": "One Western Electric rule firing on a series. ruleId mirrors spc.py's\nrule enumeration so the Python -\u003e Rust port is auditable.",
        "properties": {
          "description": {
            "type": "string"
          },
          "pointsInvolved": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "ruleId": {
            "type": "string"
          }
        },
        "required": [
          "ruleId",
          "description",
          "pointsInvolved"
        ],
        "type": "object"
      },
      "SpcRunStatus": {
        "description": "SPC result status shared by the canonical dataplane-maintenance result\npackage, connector contracts, query-layer readers, and the web-api proxy.\nservices/provider-transformations queue jobs compute and write the result\nrecords through parable-dataplane-quality-rs.\nSPC run / series outcome bucket. INSUFFICIENT_HISTORY is returned when\nthe window has fewer points than TapSpcConfig.minHistoryForViolation.",
        "enum": [
          "IN_BOUNDS",
          "WARNING",
          "OUT_OF_BOUNDS",
          "INSUFFICIENT_HISTORY"
        ],
        "type": "string"
      },
      "SpcSeriesKind": {
        "description": "Tracked SPC series kind. Also used by TapSpcConfig.trackedSeries to\ndeclare which series the cron should monitor.",
        "enum": [
          "TABLE_ROW_COUNT",
          "COLUMN_NULL_PCT",
          "COLUMN_VALIDATION_FAILURE_PCT",
          "COLUMN_DISTINCT_COUNT",
          "COLUMN_AVG"
        ],
        "type": "string"
      },
      "SpcSeriesResult": {
        "description": "SPC state for one tracked series. seriesId is stable: e.g.\n\"table.rowCount\" or \"column.email.nullPct\".",
        "properties": {
          "latestValue": {
            "format": "double",
            "type": "number"
          },
          "lowerControl3Sigma": {
            "format": "double",
            "type": "number"
          },
          "lowerWarning2Sigma": {
            "format": "double",
            "type": "number"
          },
          "mean": {
            "format": "double",
            "type": "number"
          },
          "seriesId": {
            "type": "string"
          },
          "seriesKind": {
            "$ref": "#/components/schemas/SpcSeriesKind"
          },
          "status": {
            "$ref": "#/components/schemas/SpcRunStatus"
          },
          "stddev": {
            "format": "double",
            "type": "number"
          },
          "trendSlope": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "upperControl3Sigma": {
            "format": "double",
            "type": "number"
          },
          "upperWarning2Sigma": {
            "format": "double",
            "type": "number"
          },
          "violations": {
            "items": {
              "$ref": "#/components/schemas/SpcRuleViolation"
            },
            "type": "array"
          }
        },
        "required": [
          "seriesId",
          "seriesKind",
          "latestValue",
          "mean",
          "stddev",
          "upperControl3Sigma",
          "lowerControl3Sigma",
          "upperWarning2Sigma",
          "lowerWarning2Sigma",
          "status",
          "violations"
        ],
        "type": "object"
      },
      "SqlAiCallLimits": {
        "description": "The AI-call limits each query runs under (QUERY_AI_MAX_CALLS,\nQUERY_AI_MAX_COST). A query whose aiCallSites' maxCalls add up to more than\nmaxCalls may stop at the limit with QL-SQ-010. The dry run itself refuses\nnothing: maxCalls is an upper bound, and a filter or a LIMIT often keeps\nthe real count far lower.",
        "properties": {
          "maxCalls": {
            "description": "The most paid AI calls the query may send.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "maxCostCents": {
            "description": "The most AI cost the query may spend, in US cents (QL-SQ-011).",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "maxCalls",
          "maxCostCents"
        ],
        "type": "object"
      },
      "SqlAiCallSite": {
        "description": "One AI-call node of the plan: ponder(), embed() or a Jev function. Names\nfollow QueryRunEstimateSite.",
        "properties": {
          "functionNames": {
            "description": "The SQL functions the node calls, such as ponder or embed.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "maxCalls": {
            "description": "The most Provider calls the node can make: an upper bound on the rows\nthat reach it, from the rows its leaves report and the operators between\nthem. Ad-hoc SQL reads no inference log, so each row is one call. Null\nwhen no bound can be taken, such as above a leaf that reports no rows.\nA number, so a bound of 0 stays apart from no bound.",
            "format": "double",
            "minimum": 0,
            "nullable": true,
            "type": "number"
          }
        },
        "required": [
          "functionNames"
        ],
        "type": "object"
      },
      "SqlComputeCost": {
        "description": "The compute cost the estimate implies at the configured rates\n(QUERY_ESTIMATE_CENTS_PER_GIB_READ, QUERY_ESTIMATE_CENTS_PER_CPU_HOUR). A\nfigure for a person to judge a query by: nothing bills it. US cents with\nfractions, as QueryRunEstimate.estimatedCost.",
        "properties": {
          "byBytesRead": {
            "description": "inputBytes, in GiB, times centsPerGibRead. An upper bound, as inputBytes\nis.",
            "format": "double",
            "type": "number"
          },
          "byCpuTime": {
            "description": "The predicted CPU time, in hours, times centsPerCpuHour. Null until a\nCPU-time model passes its error rule for this kind of query.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SqlEstimateRange"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "centsPerCpuHour": {
            "format": "double",
            "type": "number"
          },
          "centsPerGibRead": {
            "description": "The rates the figures used, so a reader can recompute them.",
            "format": "double",
            "type": "number"
          }
        },
        "required": [
          "byBytesRead",
          "centsPerGibRead",
          "centsPerCpuHour"
        ],
        "type": "object"
      },
      "SqlEstimate": {
        "description": "The answer to a SQL dry run.",
        "properties": {
          "aiCallLimits": {
            "description": "The AI-call limits the statement would run under. Null from a Query Layer\nthat predates them.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SqlAiCallLimits"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "aiCallSites": {
            "description": "One per AI-call node, in plan order. Empty when the statement calls no AI\nfunction.",
            "items": {
              "$ref": "#/components/schemas/SqlAiCallSite"
            },
            "type": "array"
          },
          "computeCost": {
            "$ref": "#/components/schemas/SqlComputeCost"
          },
          "elapsedMs": {
            "description": "Engine milliseconds: from the first batch to the end of the stream, less\nthe client's reading time and the wait for a concurrency permit. Null\nuntil a time model passes its error rule for this kind of query.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SqlEstimateRange"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "input": {
            "$ref": "#/components/schemas/SqlInputEstimate"
          }
        },
        "required": [
          "input",
          "computeCost",
          "aiCallSites"
        ],
        "type": "object"
      },
      "SqlEstimateRange": {
        "description": "A range a model predicts, and the model that predicted it.",
        "properties": {
          "high": {
            "format": "double",
            "type": "number"
          },
          "low": {
            "format": "double",
            "type": "number"
          },
          "modelVersion": {
            "type": "string"
          }
        },
        "required": [
          "low",
          "high",
          "modelVersion"
        ],
        "type": "object"
      },
      "SqlInputEstimate": {
        "description": "What a statement reads, from its physical plan's leaves before it runs\n(estimate_plan_input in services/pkg/datafusion-ext-rs/src/plan_profile.rs,\nthe value Query Layer records for every query it executes). Bytes count\nafter partition pruning and before file-statistics and row-group pruning,\nso they bound what the query reads from storage.",
        "properties": {
          "inputBytes": {
            "description": "Bytes of the files the plan's file scans read, or of the byte ranges a\nsplit file is read in.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "inputFileCount": {
            "description": "Files the plan's file scans read.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "inputRows": {
            "description": "Rows the plan's other leaves report, such as a Workspace Pool\nprojection's batch, plus the rows the file scans' statistics report.\nNull when no leaf reports a row count. A number rather than an Int64\nscalar, so null and 0 stay apart in every language.",
            "format": "double",
            "minimum": 0,
            "nullable": true,
            "type": "number"
          },
          "unmeasuredLeaves": {
            "description": "Leaves that read no file and report no rows, such as a\nworkspace.preferences read. Above 0, inputBytes and inputRows undercount.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "inputBytes",
          "inputFileCount",
          "unmeasuredLeaves"
        ],
        "type": "object"
      },
      "SsoCallbackInput": {
        "properties": {
          "code": {
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "type": "object"
      },
      "SsoStartInput": {
        "properties": {
          "redirectUri": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "tenantSlug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "tenantSlug",
          "redirectUri"
        ],
        "type": "object"
      },
      "SsoStartResult": {
        "properties": {
          "authorizationUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "authorizationUrl",
          "state"
        ],
        "type": "object"
      },
      "StartLoginEmailInput": {
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "returnTo": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "StartParableProblemRunInput": {
        "properties": {
          "contextSelection": {
            "$ref": "#/components/schemas/ParableProblemContextSelectionInput"
          },
          "debugRequested": {
            "description": "Actor preference/route intent only. The server enables Debug only after\nrechecking admin.parables.debug, Admin Ponder, and resource authorization.",
            "type": "boolean"
          },
          "expectedProblemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "model": {
            "description": "The model the person picked for this Run (PARABLE-6164). Null from a\nclient that predates the field; web-api then uses Ponder Standard.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/PonderChatModelChoice"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "skillIds": {
            "description": "Explicit Agent Skills activated for this Run; the server resolves immutable snapshots.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 20,
            "minItems": 0,
            "type": "array"
          },
          "trigger": {
            "$ref": "#/components/schemas/ParableProblemRunTriggerInput"
          }
        },
        "required": [
          "trigger",
          "expectedProblemRevision",
          "contextSelection",
          "idempotencyKey",
          "skillIds",
          "debugRequested"
        ],
        "type": "object"
      },
      "StartParableProblemRunResult": {
        "properties": {
          "problemRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "run": {
            "$ref": "#/components/schemas/ParableProblemRun"
          },
          "triggeredByMessage": {
            "$ref": "#/components/schemas/ParableProblemMessage"
          }
        },
        "required": [
          "run",
          "triggeredByMessage",
          "problemRevision"
        ],
        "type": "object"
      },
      "StartParableViewAsInput": {
        "description": "Who to preview a Parable as: one active member of its Workspace whose seat is\nat or below your own.",
        "properties": {
          "personId": {
            "description": "The person to preview as, from listParableViewAsTargets.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "personId"
        ],
        "type": "object"
      },
      "StartSignupEmailInput": {
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "returnTo": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "StopPonderParableMessageInput": {
        "description": "The replay identity of one Stop request. It is separate from the reply being\nstopped, so a broker that owns replay keys never rewrites the Stop target.",
        "properties": {
          "idempotencyKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "idempotencyKey"
        ],
        "type": "object"
      },
      "StringPatternRateRule": {
        "properties": {
          "column": {
            "type": "string"
          },
          "maxRate": {
            "format": "double",
            "type": "number"
          },
          "pattern": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "column",
          "pattern",
          "maxRate"
        ],
        "type": "object"
      },
      "SyncJobStatus": {
        "description": "Status of a sync job.",
        "enum": [
          "pending",
          "running",
          "completed",
          "failed",
          "cancelled",
          "partial_success"
        ],
        "type": "string"
      },
      "SyncModeEnum": {
        "description": "Sync strategy for a tap.",
        "enum": [
          "full",
          "incremental"
        ],
        "type": "string"
      },
      "SyntheticKeyAlgorithm": {
        "description": "Hash algorithm for generating synthetic primary keys.",
        "enum": [
          "sha1",
          "sha256"
        ],
        "type": "string"
      },
      "SyntheticPrimaryKeyConfig": {
        "description": "=============================================================================\nSynthetic Primary Key Types\n=============================================================================\nConfiguration for generating a synthetic primary key by hashing multiple fields.\nWhen present on a tap, the engine concatenates the specified fields, hashes them,\nand injects the result into the record. A nested field is a dotted path of bare\nor double-quoted identifiers (id.time, properties.\"$insert_id\"); the definition\ngate rejects any other JMESPath, because promote recomputes the key for rows\nthat landed before the tap declared it and reads only that subset (PARABLE-4222).\nUses outputField when set; otherwise falls back to primaryKey as the output field name.\nA single '*' entry in fields hashes every top-level record key (sorted canonical\nJSON, excluding the output field) for rows whose columns are not known ahead of time.",
        "properties": {
          "algorithm": {
            "description": "Hash algorithm (default: sha1)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SyntheticKeyAlgorithm"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "fields": {
            "description": "Record fields to concatenate for hash input",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "fieldsConfigKey": {
            "description": "Authoring directive: the ingestion-config property whose non-empty\nstring-array value replaces `fields` for that Workspace (e.g. a Workday\nRaaS report's key columns). The execution-plan compiler resolves it once\nand freezes only the final field list; the definition's `fields` stay the\ndefault when the property is absent or empty.",
            "nullable": true,
            "type": "string"
          },
          "outputField": {
            "description": "Top-level record field for the hash (default: tap primaryKey)",
            "nullable": true,
            "type": "string"
          },
          "separator": {
            "description": "Separator between field values (default: '|')",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "fields"
        ],
        "type": "object"
      },
      "TableMaintenanceResult": {
        "description": "Canonical Delta-maintenance records. services/provider-transformations queue\njobs compute and write them through parable-dataplane-quality-rs.\nOne periodic maintenance run against a contract. Records what action\nwas taken and the before / after sizing.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/MaintenanceAction"
          },
          "bytesAfter": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "bytesBefore": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "capturedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "durationMs": {
            "description": "Signed integer count of milliseconds: an amount of elapsed time, never a point in time. An epoch timestamp is Temporal.DateTime with x-temporal-format: unix_millis.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "filesAfter": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "filesBefore": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "skippedReason": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SkippedReason"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "tapContractId": {
            "description": "The tenant connector tap this result describes (TenantConnectorTap.id).\nThe name predates the removal of tap contracts (PARABLE-1509) and\nmatches the tap_contract_id sidecar column. Rows written for a data\ncontract before PARABLE-2622 may hold null here.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "vacuumRetentionHours": {
            "description": "Set when VACUUM ran. Retention floor in hours.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "zOrderColumns": {
            "description": "Set when action = OPTIMIZE_ZORDER. Order matches the Z-ORDER call.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "runId",
          "capturedAt",
          "action",
          "filesBefore",
          "filesAfter",
          "bytesBefore",
          "bytesAfter",
          "durationMs"
        ],
        "type": "object"
      },
      "TableQualityResult": {
        "description": "Canonical data-quality records. services/provider-transformations queue jobs\ncompute and write them through parable-dataplane-quality-rs.\nThe check set covers only the computable subset of the Data Quality\nGates (no human-in-the-loop checks, no sample-accuracy in Gate 5).\nResult of a single data-quality run against a contract. One row per\nqueue job per contract; per-check results embedded.",
        "properties": {
          "capturedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "checks": {
            "items": {
              "$ref": "#/components/schemas/QualityCheckResult"
            },
            "type": "array"
          },
          "lifecycle": {
            "$ref": "#/components/schemas/QualityResultLifecycle",
            "description": "Whether this result was captured at promote-time or on a cadence re-verify."
          },
          "overallStatus": {
            "$ref": "#/components/schemas/QualityRunStatus"
          },
          "resultId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tapContractId": {
            "description": "The tenant connector tap this result describes (TenantConnectorTap.id).\nThe name predates the removal of tap contracts (PARABLE-1509) and\nmatches the tap_contract_id sidecar column. Rows written for a data\ncontract before PARABLE-2622 may hold null here.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "resultId",
          "runId",
          "capturedAt",
          "overallStatus",
          "lifecycle",
          "checks"
        ],
        "type": "object"
      },
      "TableShapeStats": {
        "description": "Canonical shape statistics records. services/provider-transformations queue\njobs write them through parable-dataplane-quality-rs, and\nservices/query-layer reads them.\nThese replace the legacy services/transformation-flows shape_capture.py\nDelta writer; the dataset_id-keyed shape_history table is read-only\nafter cutover (P7).\nLatest shape snapshot for a contract, produced by a\nservices/provider-transformations queue job. Replaces the legacy\nshape_history row from services/transformation-flows.",
        "properties": {
          "capturedAt": {
            "description": "Wall-clock timestamp the snapshot was captured.",
            "format": "date-time",
            "type": "string"
          },
          "columnCount": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "columns": {
            "description": "Per-column entries. Order matches the contract outputSchema.",
            "items": {
              "$ref": "#/components/schemas/ColumnShapeStats"
            },
            "type": "array"
          },
          "distinctCountsExact": {
            "description": "When false, distinct counts in ColumnShapeStats are approximate: every\ncounted column uses HyperLogLog (`approx_distinct`) so the count's\nmemory does not grow with the table (PARABLE-4794). True only when no\ncolumn was counted.",
            "type": "boolean"
          },
          "loadType": {
            "description": "Optional label set on backfill rows so historical shape_history\nconversions can be filtered out by SPC consumers. Empty on rows\nwritten by services/provider-transformations queue jobs.",
            "nullable": true,
            "type": "string"
          },
          "rowCount": {
            "description": "Dataset-level metrics.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "runDate": {
            "description": "Calendar date, normalized to ISO 'YYYY-MM-DD'. Accepts ISO ('2025-01-01'), slash-separated ('2025/01/15', '01/15/2025'), named-month ('January 15, 2025', 'Jan 15, 2025'), and full RFC3339 datetime (the time portion is dropped).",
            "format": "date",
            "maxLength": 40,
            "type": "string"
          },
          "runId": {
            "description": "Run identity. runId is the maintenance run UUID (NOT the\ntransformation-flow write UUID, which is the shape_history convention);\nrunDate is the logical date the run targets in YYYY-MM-DD form.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sampledRowCount": {
            "description": "Rows the scan read when the run sampled the table, or null when it read\nevery row (PARABLE-4794). A table whose Delta log counts more rows than\nthe stats job's scan limit is read through a deterministic sample of its\nfiles. rowCount, totalByteSize, and each column's null count and min/max\nthat the Delta log records still describe the whole table; every other\ncolumn field is estimated from the sample, and distinctCount is null.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "snapshotId": {
            "description": "Stable identity for this snapshot. Equal to the maintenance run UUID\nfor the row that produced it; two reads of the same row return the\nsame snapshotId.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "storageUri": {
            "description": "Source Delta path of the contract this snapshot was computed against\n(the contract's outputUri, NOT the maintenance stats path).",
            "format": "uri",
            "maxLength": 4096,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "tapContractId": {
            "description": "The tenant connector tap this snapshot describes (TenantConnectorTap.id).\nThe name predates the removal of tap contracts (PARABLE-1509) and\nmatches the tap_contract_id sidecar column. Rows written for a data\ncontract before PARABLE-2622 may hold null here.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "totalByteSize": {
            "description": "Total uncompressed byte size of the underlying Delta table at capture\ntime, summed from Delta add-action metadata. Null when the size\ncannot be determined.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "snapshotId",
          "runId",
          "runDate",
          "capturedAt",
          "rowCount",
          "columnCount",
          "distinctCountsExact",
          "storageUri",
          "columns"
        ],
        "type": "object"
      },
      "TableSpcResult": {
        "description": "Canonical SPC analysis records. services/provider-transformations queue jobs\ncompute and write them through parable-dataplane-quality-rs.\nSPC analysis output for a single contract at one run. One TableSpcResult\nper queue job per contract; each carries SPC state for every tracked\nseries. Series identity is stable across runs so dashboards can chart\nviolations over time.",
        "properties": {
          "capturedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "overallStatus": {
            "$ref": "#/components/schemas/SpcRunStatus"
          },
          "resultId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "runId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "series": {
            "items": {
              "$ref": "#/components/schemas/SpcSeriesResult"
            },
            "type": "array"
          },
          "tapContractId": {
            "description": "The tenant connector tap this result describes (TenantConnectorTap.id).\nThe name predates the removal of tap contracts (PARABLE-1509) and\nmatches the tap_contract_id sidecar column. Rows written for a data\ncontract before PARABLE-2622 may hold null here.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "windowSize": {
            "description": "Size of the history window (in number of TableShapeStats rows) used to\ncompute control limits and rule firings.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "resultId",
          "runId",
          "capturedAt",
          "windowSize",
          "overallStatus",
          "series"
        ],
        "type": "object"
      },
      "TapAccessConfig": {
        "description": "The access facts a tap carries for source permissions (EDR-0095). The sync\nmanifest carries it and the execution plan drops it: the access job reads\nit live, as the identity job reads identityDirectory.",
        "properties": {
          "defaultAudience": {
            "description": "Overrides the connector's defaultAudience for this tap.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorDefaultAudienceEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "roles": {
            "description": "Which access facts the tap's rows are.",
            "items": {
              "$ref": "#/components/schemas/TapAccessRoleEnum"
            },
            "type": "array"
          }
        },
        "required": [
          "roles"
        ],
        "type": "object"
      },
      "TapAccessRoleEnum": {
        "description": "Which access facts a tap carries (EDR-0095). The access job discovers its\ninputs from these roles, the way the identity job discovers directory taps.",
        "enum": [
          "principals",
          "memberships",
          "grants",
          "resources"
        ],
        "type": "string"
      },
      "TapCustomFieldsConfig": {
        "description": "Capture config for dynamic/custom fields on the provider-pool promote path\n(PARABLE-734). Patterns route keys into `_custom_fields`; remaining\nundeclared keys land in `_raw_unknown_fields` when captureUnknownFields is\ntrue. Prefer patterns over per-tenant field ID allowlists.",
        "properties": {
          "captureUnknownFields": {
            "description": "When true, undeclared keys that do not match known patterns land in\n`_raw_unknown_fields` instead of being dropped.",
            "type": "boolean"
          },
          "knownCustomFieldKeyPatterns": {
            "description": "Glob-style patterns (prefix `customfield_*`, suffix `*__c`, or exact).",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "captureUnknownFields"
        ],
        "type": "object"
      },
      "TapDataKindEnum": {
        "description": "Materialization class for a tap's records on the ingestion-to-transformation\npromote path. Selects how the transformation layer materializes the stream.",
        "enum": [
          "snapshot",
          "event",
          "changelog"
        ],
        "type": "string"
      },
      "TapDeletionSemanticsEnum": {
        "description": "How deletions in the source are detectable for a tap.",
        "enum": [
          "by_absence",
          "tombstone",
          "undetectable"
        ],
        "type": "string"
      },
      "TapDocumentation": {
        "description": "Reader-facing identity for a connector tap. The longer explanation and\nglyph live beside this object on the tap because they have distinct scalar\nand validation contracts.",
        "properties": {
          "title": {
            "description": "Short human-facing title used in catalog and configuration surfaces.",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "TapPerParentAuth": {
        "description": "=============================================================================\nPer-Parent Authentication\n=============================================================================\nPer-parent authentication configuration for taps that iterate over records\nfrom a parent tap. A tap can mint a delegated service-account token or retain\nthe connector credential and add a request header derived from its parent.",
        "properties": {
          "headerName": {
            "description": "Request header added by `request_header`.",
            "nullable": true,
            "type": "string"
          },
          "impersonateField": {
            "description": "Parent field containing the delegated service-account subject.",
            "nullable": true,
            "type": "string"
          },
          "method": {
            "description": "`service_account` mints a delegated token. `request_header` keeps the\nconnector authorization and adds one parent-derived request header.",
            "type": "string"
          },
          "quotaUserHeader": {
            "description": "Optional HTTP header name to set the per-user value on each request\n(e.g., `x-goog-quota-user` so per-user quota is attributed to the\nimpersonated user instead of the service account).",
            "nullable": true,
            "type": "string"
          },
          "valueField": {
            "description": "Parent-record field path whose scalar value is written to `headerName`.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "method"
        ],
        "type": "object"
      },
      "TapQualityConfig": {
        "properties": {
          "rules": {
            "items": {
              "$ref": "#/components/schemas/QualityRuleConfig"
            },
            "type": "array"
          },
          "spc": {
            "$ref": "#/components/schemas/TapSpcConfig"
          }
        },
        "required": [
          "rules",
          "spc"
        ],
        "type": "object"
      },
      "TapRequiredAccess": {
        "description": "The access a Provider credential must carry before a tap can read its data.\nDerived on read from the connector's permissionModel and the tap's own\ndeclaration by connectordef.RequiredAccess. Never stored or authored, so it\ncannot drift from sync.scopes or objectName. Multiple auth strategies\nyield unknown until per-strategy declarations are supported. Combined\npermission models are unsupported and fail validation.",
        "properties": {
          "model": {
            "$ref": "#/components/schemas/ConnectorPermissionModelEnum",
            "description": "How the connector gates access. A connector with no permissionModel reads\nas none."
          },
          "values": {
            "description": "oauth_scope: the tap's sync.scopes. object_acl: the tap's objectName.\nnone: empty, because the credential works for the whole account or not at\nall.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "model",
          "values"
        ],
        "type": "object"
      },
      "TapRetentionPolicy": {
        "description": "=============================================================================\nRetention Policy\n=============================================================================\nData retention policy for a tap's source API.\nWhen set, enables proactive alerting when ingestion gaps risk\npermanent data loss due to source-side retention expiry.",
        "properties": {
          "alertThresholdDays": {
            "description": "Alert when remaining coverage buffer drops below this many days.\nDefault: 7 days (alert fires when we are 7 days from losing data).",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "retentionDays": {
            "description": "Maximum number of days the source API retains historical data.\nAfter this window, data is permanently unrecoverable.\nExample: Google Meet API = 30 days, Zoom Reports = 180 days.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "retentionDays"
        ],
        "type": "object"
      },
      "TapSpcConfig": {
        "properties": {
          "minHistoryForViolation": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 1000,
            "minimum": 2,
            "type": "integer"
          },
          "trackedSeries": {
            "items": {
              "$ref": "#/components/schemas/SpcSeriesKind"
            },
            "maxItems": 16,
            "minItems": 1,
            "type": "array"
          },
          "windowSize": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 1000,
            "minimum": 2,
            "type": "integer"
          }
        },
        "required": [
          "windowSize",
          "trackedSeries",
          "minHistoryForViolation"
        ],
        "type": "object"
      },
      "TapSyncConfig": {
        "description": "=============================================================================\nSync Configuration\n=============================================================================\nSync strategy and incremental parameters for a tap.",
        "properties": {
          "asyncQuery": {
            "description": "Async query configuration for APIs that use a create-poll-fetch pattern\n(e.g., Microsoft Purview audit logs). When present, the ingestion engine\nPOSTs to create a query job, polls for completion, then fetches paginated results.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/AsyncQueryConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "cursorField": {
            "description": "Cursor field for incremental sync watermarks (e.g., 'updated_at').\nRequired when mode = INCREMENTAL.",
            "nullable": true,
            "type": "string"
          },
          "cursorValueFormat": {
            "description": "Format of raw cursorField values on API records (partial watermark only).\nStored control-plane watermarks remain ISO8601.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/IncrementalTimeFormatEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "incrementalParams": {
            "description": "Configuration for incremental time-based filtering",
            "oneOf": [
              {
                "$ref": "#/components/schemas/IncrementalParamsConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "maxLookbackDays": {
            "description": "Maximum lookback days for a run without a watermark. When set, the\nwatermarkless window is capped to min(global lookback, maxLookbackDays).\nUse for APIs with data retention limits (e.g., Zoom Report API rejects\nqueries older than 12 months).",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "mode": {
            "$ref": "#/components/schemas/SyncModeEnum",
            "description": "Sync mode: FULL extracts all records, INCREMENTAL uses watermarks"
          },
          "refreshLookbackDays": {
            "description": "Number of days to overlap each incremental request with prior work.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "scopes": {
            "description": "OAuth scopes required for this tap (e.g., Google Workspace per-service scopes)",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "required": [
          "mode"
        ],
        "type": "object"
      },
      "TapTransportOption": {
        "description": "=============================================================================\nTransport Options\n=============================================================================\nA prioritized transport option for executing a tap.\nTaps can define multiple options and the runtime chooses by priority.",
        "properties": {
          "apiType": {
            "$ref": "#/components/schemas/ApiTypeEnum",
            "description": "API transport type for this option"
          },
          "errorBodyRules": {
            "description": "Rules for disambiguating HTTP error responses by inspecting the response body.\nAllows overriding the default error classification (transient/permanent/skippable)\nbased on status code + body content.",
            "items": {
              "$ref": "#/components/schemas/ErrorBodyRule"
            },
            "nullable": true,
            "type": "array"
          },
          "graphqlConfig": {
            "description": "GraphQL endpoint configuration (when apiType = GRAPHQL)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/GraphQLEndpointConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationConfig",
            "description": "Pagination configuration for this transport option"
          },
          "paginationHook": {
            "description": "Optional hook reference for custom pagination behavior",
            "nullable": true,
            "type": "string"
          },
          "priority": {
            "description": "Execution priority (1 is highest priority)",
            "format": "double",
            "type": "number"
          },
          "providerBudgetOperation": {
            "description": "The provider budget policy operation every request of this option charges.\nProvider-budget taps read pages, streams and batches; a tap with field\ndiscovery or an async job uses fixed admission.",
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "restConfig": {
            "description": "REST endpoint configuration (when apiType = REST)",
            "oneOf": [
              {
                "$ref": "#/components/schemas/RestEndpointConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          }
        },
        "required": [
          "priority",
          "apiType",
          "pagination"
        ],
        "type": "object"
      },
      "TemporalOrderRule": {
        "properties": {
          "maxViolations": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "maxViolations"
        ],
        "type": "object"
      },
      "Tenant": {
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "logo": {
            "description": "Tenant logo for branding.",
            "nullable": true,
            "type": "object"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "name",
          "slug"
        ],
        "type": "object"
      },
      "TenantConnectorConfigurationHistory": {
        "properties": {
          "authenticationConfig": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "authenticationStrategyId": {
            "description": "Pull auth strategy used for this attempt. Null for STREAMING connectors,\nwhich report inboundAuthStrategyId instead.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "connectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "groupingId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "inboundAuthStrategyId": {
            "description": "Inbound auth strategy used for this attempt (STREAMING connectors only).",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ingestionConfig": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "parentDataFilters": {
            "description": "Workspace allowlist snapshot. Same shape as TenantConnector.parentDataFilters.",
            "items": {
              "$ref": "#/components/schemas/TenantParentDataFilterEntry"
            },
            "nullable": true,
            "type": "array"
          },
          "result": {
            "description": "Any valid JSON value: object, array, primitive, or null"
          },
          "success": {
            "type": "boolean"
          },
          "tenantConnectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "tenantId",
          "groupingId",
          "tenantConnectorId",
          "connectorId",
          "authenticationConfig",
          "ingestionConfig",
          "success",
          "result"
        ],
        "type": "object"
      },
      "TenantConnectorInstance": {
        "description": "Instance of a configured connector for a tenant.",
        "properties": {
          "authenticationConfig": {
            "description": "The authentication configuration for this connector instance",
            "nullable": true,
            "type": "object"
          },
          "authenticationStrategy": {
            "description": "The authentication strategy used for this connector instance",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ConnectorAuthStrategy"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "connectionStatus": {
            "$ref": "#/components/schemas/TenantConnectorStatusEnum",
            "description": "Current status of this connector instance."
          },
          "connectionStatusMessage": {
            "description": "Human-readable message describing the current connection status.",
            "type": "string"
          },
          "connector": {
            "$ref": "#/components/schemas/Connector",
            "description": "The connector"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "credentialErrorCode": {
            "description": "Latest credential validation error code for this connector instance.\nMirrors ConnectorCredentialDetail.errorCode so the directory tile can\nrender a fine-grained customer CTA (TokenExpired / InsufficientScopes /\nAuthFailed / ...) without an extra per-instance lookup.\nNull whenever the most recent credential validation succeeded or has not\nyet produced a recognised ValidationErrorCode.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ValidationErrorCode"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "credentialMetadataId": {
            "description": "ID of the current credential metadata record for this connector instance.\nUseful for polling validation status after submitCredentials.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "credentialStatus": {
            "description": "Status of the most recent credential record for this connector instance.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/CredentialStatus"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "grouping": {
            "$ref": "#/components/schemas/ParableVendorGrouping",
            "description": "The grouping this instance is configured from"
          },
          "hasValidCredentials": {
            "description": "Whether credentials are configured and valid",
            "type": "boolean"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ingestionConfig": {
            "description": "The ingestion configuration for this connector instance",
            "nullable": true,
            "type": "object"
          },
          "lastDataReceivedAt": {
            "description": "When a push (streaming) connection last received data: the newest\nlastUsedAt among its ingest tokens, which the collector stamps when it\nlands data for a token, at most once a minute (PARABLE-6300). Null for a\npull connection, and for a push connection no sender has delivered to yet.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "lastNonSyncStatus": {
            "description": "Display health derived without queued/running activity. Absent/null when\nhealth is not established; cards must not interpret that as healthy.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TenantConnectorStatusEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "lastNonSyncStatusMessage": {
            "description": "Message derived with lastNonSyncStatus.",
            "nullable": true,
            "type": "string"
          },
          "lastSyncAt": {
            "description": "Last sync timestamp",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "lastSyncStatus": {
            "description": "Last sync status",
            "oneOf": [
              {
                "$ref": "#/components/schemas/SyncJobStatus"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "name": {
            "description": "Optional user-facing label for this connector instance.",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "parentDataFilters": {
            "description": "Workspace allowlist: one predicate per parent tap.",
            "items": {
              "$ref": "#/components/schemas/TenantParentDataFilterEntry"
            },
            "nullable": true,
            "type": "array"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "grouping",
          "connector",
          "connectionStatus",
          "connectionStatusMessage",
          "hasValidCredentials"
        ],
        "type": "object"
      },
      "TenantConnectorStatusEnum": {
        "description": "Operational status of a tenant connector instance.",
        "enum": [
          "disabled",
          "sync_failed",
          "manual_validation_required",
          "validation_pending",
          "initial_syncing",
          "update_syncing",
          "sync_queued",
          "idle",
          "sync_partial_success",
          "transform_quality_degraded",
          "schedule_paused",
          "config_invalid",
          "credential_error",
          "internal_error",
          "ingestion_stale"
        ],
        "type": "string"
      },
      "TenantConnectorTapConfig": {
        "description": "=============================================================================\nTenantConnectorTap.config\n=============================================================================\nTyped JSON payload for TenantConnectorTap.config (PARABLE-2063 / PARABLE-2222).\nKind-dependent keys share one object: OVERRIDE/CUSTOM may set selectedFields;\nARTIFACT uses catalogSlug + storageUri; promotion sets materializedDefault.\nOnly these keys are preserved across typed config round-trips; undeclared\nJSON keys are dropped when the control plane marshals this type.",
        "properties": {
          "catalogSlug": {
            "description": "ARTIFACT taps: SQL/catalog table slug (query-layer v2). Written by\npublishArtifact; a client write carrying it is rejected (WA-TCT-029).",
            "maxLength": 255,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$",
            "type": "string"
          },
          "materializedDefault": {
            "description": "Marks a reconciled OVERRIDE copy as system-owned so connector promotion\ncan refresh it. Cleared when a human edits the tap schema/config.",
            "nullable": true,
            "type": "boolean"
          },
          "selectedFields": {
            "description": "Per-tenant source-column allowlist. When set, ingestion requests only\nthese fields (plus system/cursor/PK/tombstone fields) from the source API.\nUnknown names are skipped after describe intersection.\nIntentional (PARABLE-2222 1A'): this list is also the bronze keep-set SoT\nand may include custom columns outside the platform OVERRIDE outputSchema.\nlistMax leaves headroom above the Sunrun Opportunities seed (135).\nAbsent/null means \"collect every field\"; an explicit empty list is\nrejected by listMin (PARABLE-3350), matching the repair migration's\n1..500 bound. Length-based presence checks in consumers remain safe:\nnil and a validated list agree on len().",
            "items": {
              "maxLength": 255,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*$",
              "type": "string"
            },
            "maxItems": 500,
            "minItems": 1,
            "nullable": true,
            "type": "array"
          },
          "storageUri": {
            "description": "ARTIFACT taps: Delta URI of the published artifact table,\ngs://{Workspace data bucket}/silver/artifact-upload/{catalogSlug}. Written\nby publishArtifact; a client write carrying it is rejected (WA-TCT-029),\nand the query layer serves only a URI under the Workspace's own bucket.",
            "format": "uri",
            "maxLength": 4096,
            "nullable": true,
            "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://[^\\s]+$",
            "type": "string"
          },
          "systemDisabled": {
            "description": "Marks a row ReconcileTenantConnectorTaps disabled because its platform\ntap left the enabled selection. Reconcile only re-enables rows carrying\nthis stamp, so a user's enabled=false is never reverted by a config save\n(PARABLE-2165).",
            "nullable": true,
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "TenantConnectorTapInfo": {
        "description": "Per-tenant tap configuration. Either narrows a platform `ConnectorTap`'s\noutput schema for this tenant (override case) or stands in for an\nartifact-derived tap (artifact case). See EDR-0021 for the model.",
        "properties": {
          "artifactId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "canonicalPersonSource": {
            "description": "Whether this tap is one of the Workspace's canonical person/identity\nsources. Any number of active taps may carry the designation; ordering\namong canonical sources is by `createdAt`, earlier wins.",
            "type": "boolean"
          },
          "config": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TenantConnectorTapConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "connectorTapId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "enabledSince": {
            "description": "Start of the current uninterrupted enabled period. Null when disabled or\nwhen the enabled period predates tracking.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/TenantConnectorTapKindEnum",
            "description": "Discriminates override / custom / artifact (EDR-0021). Readers use it to\npick effective-schema semantics: OVERRIDE inherits platform directives,\nCUSTOM / ARTIFACT outputSchema is self-authoritative."
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "tenantConnectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "updatedAt",
          "tenantConnectorId",
          "connectorTapId",
          "name",
          "enabled",
          "kind",
          "outputSchema",
          "canonicalPersonSource"
        ],
        "type": "object"
      },
      "TenantConnectorTapInput": {
        "description": "Optional fields shared by create (nested under `tap`) and update.\nOmitted create fields come from the platform ConnectorTap: name,\ndescription, and outputSchema copy the platform tap, enabled defaults\nto true, kind is OVERRIDE.",
        "properties": {
          "canonicalPersonSource": {
            "description": "Mark this tap as one of the Workspace's canonical person/identity\nsources. Any number of active taps may carry the designation; ordering\namong canonical sources is by tap creation time, earlier wins.\nNull on create = false. Null on update = leave unchanged.",
            "nullable": true,
            "type": "boolean"
          },
          "config": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TenantConnectorTapConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "nullable": true,
            "type": "boolean"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "nullable": true,
            "type": "object"
          }
        },
        "type": "object"
      },
      "TenantConnectorTapKindEnum": {
        "description": "Discriminates the three TenantConnectorTap cases (EDR-0021 / CFGR-8). The\nkind decides how the effective schema is resolved for promote metadata:\nOVERRIDE merges platform directives onto the tenant overlay; CUSTOM and\nARTIFACT are self-authoritative (the tenant outputSchema carries its own\n`x-transform*` directives).",
        "enum": [
          "override",
          "custom",
          "artifact"
        ],
        "type": "string"
      },
      "TenantFlagPhaseEnum": {
        "description": "Per-tenant lifecycle phase for an early-access release.\nOFF: not visible to anyone in this tenant.\nINTERNAL_PREVIEW: visible only to Parable staff (admin.earlyaccess.read) visiting this tenant; tenant users do not see the feature.\nRELEASED: visible to all tenant users with tenant.earlyaccess.view, plus staff.\nTransitions are unconstrained -- any phase can transition to any other. The rollback case (RELEASED -\u003e INTERNAL_PREVIEW or OFF) is handled in the admin UI with a confirmation prompt, not in the schema.",
        "enum": [
          "off",
          "internal_preview",
          "released"
        ],
        "type": "string"
      },
      "TenantKind": {
        "description": "What a Workspace is for (EDR-0093). Only the simulation gate, the\nrole-grant reconciler, createTenant, admin Ponder's default authoring\nWorkspace (exactly one dogfood), and the DEMO/DOGFOOD/SYSTEM badges read it;\nno other read path, permission check, or Workspace app behavior may branch\non it. The System Workspace is identified by SystemWorkspaceContract.ID,\nnever by this kind.",
        "enum": [
          "customer",
          "dogfood",
          "demo",
          "system"
        ],
        "type": "string"
      },
      "TenantLoginPolicy": {
        "description": "Customer API projection of tenant login policy (no SCIM token fingerprint).",
        "properties": {
          "activeMethod": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/LoginMethodEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "allowedMethods": {
            "items": {
              "$ref": "#/components/schemas/LoginMethodEnum"
            },
            "type": "array"
          },
          "apiTokensEnabled": {
            "description": "Whether personal access tokens may reach this Workspace (PARABLE-4943).",
            "type": "boolean"
          },
          "breakglassEmail": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "nullable": true,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lastRefreshedFromStytchAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "lastTestConfigFingerprint": {
            "nullable": true,
            "type": "string"
          },
          "lastTestSucceededAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "scimConnectionId": {
            "nullable": true,
            "type": "string"
          },
          "scimDefaultRoleId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scimEnabled": {
            "type": "boolean"
          },
          "ssoConnectionId": {
            "nullable": true,
            "type": "string"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "tenantId",
          "allowedMethods",
          "scimEnabled",
          "apiTokensEnabled"
        ],
        "type": "object"
      },
      "TenantParable": {
        "description": "Detail view: the summary plus the composed, read-stripped entity package.",
        "properties": {
          "color": {
            "description": "CSS color value normalized to 8-digit RGBA hex format (#RRGGBBAA)",
            "maxLength": 9,
            "nullable": true,
            "pattern": "^#[0-9A-Fa-f]{8}$",
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "package": {
            "$ref": "#/components/schemas/ParableEffectiveEntityPackage"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "versionNumber": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "parableId",
          "handle",
          "name",
          "versionNumber",
          "package"
        ],
        "type": "object"
      },
      "TenantParableSummary": {
        "description": "One published Parable visible to the Workspace. Icon and color pass through\nverbatim; the frontend owns deterministic fallbacks.",
        "properties": {
          "color": {
            "description": "CSS color value normalized to 8-digit RGBA hex format (#RRGGBBAA)",
            "maxLength": 9,
            "nullable": true,
            "pattern": "^#[0-9A-Fa-f]{8}$",
            "type": "string"
          },
          "handle": {
            "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "^[a-z][A-Za-z0-9]*$",
            "type": "string"
          },
          "icon": {
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "parableId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "versionNumber": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "parableId",
          "handle",
          "name",
          "versionNumber"
        ],
        "type": "object"
      },
      "TenantParentDataFilterEntry": {
        "description": "One workspace allowlist entry: a parent tap name and the predicate applied\nto that tap's records before child fan-out. Look up by parentTap at read time.",
        "properties": {
          "parentTap": {
            "description": "Parent tap name this predicate applies to (traversal edge `from`).",
            "maxLength": 255,
            "type": "string"
          },
          "predicate": {
            "$ref": "#/components/schemas/ParentEligibilityPredicate"
          }
        },
        "required": [
          "parentTap",
          "predicate"
        ],
        "type": "object"
      },
      "TenantParentDataFilterEntryInput": {
        "description": "Write-side pair of TenantParentDataFilterEntry.",
        "properties": {
          "parentTap": {
            "maxLength": 255,
            "type": "string"
          },
          "predicate": {
            "$ref": "#/components/schemas/ParentEligibilityPredicateInput"
          }
        },
        "required": [
          "parentTap",
          "predicate"
        ],
        "type": "object"
      },
      "TenantProviderPoolRebuild": {
        "description": "A rebuild of one of this Workspace's Provider Pool taps, waiting for\napproval or in progress (PARABLE-5348, technical spec 0082 \"Provider Pool\nlayouts and rebuilds\").",
        "properties": {
          "abortedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "abortedReason": {
            "nullable": true,
            "type": "string"
          },
          "approvedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "approvedBy": {
            "description": "UUID v4 string as base62",
            "nullable": true,
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "classification": {
            "$ref": "#/components/schemas/ProviderPoolLayoutClassification"
          },
          "classificationHash": {
            "description": "Approval sends this hash back.",
            "type": "string"
          },
          "connectorId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "declinedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "declinedBy": {
            "description": "UUID v4 string as base62",
            "nullable": true,
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "declinedReason": {
            "nullable": true,
            "type": "string"
          },
          "effectiveTapId": {
            "description": "The platform tap the Workspace tap's Provider Pool is stored under.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "failedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "fromLayoutId": {
            "description": "The served layout the item was classified against.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "identityAccountsRekeyed": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "identityImpact": {
            "$ref": "#/components/schemas/ProviderPoolIdentityImpactEnum"
          },
          "notBefore": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "readyAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "reasons": {
            "items": {
              "$ref": "#/components/schemas/ProviderPoolRebuildReasonEnum"
            },
            "type": "array"
          },
          "rebuildTableIds": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "requestedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "requestedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "stale": {
            "description": "A PENDING_APPROVAL item older than the configured stale age\n(PROVIDER_POOL_REBUILD_STALE_AFTER, 14 days by default). Derived on read.",
            "type": "boolean"
          },
          "staleAt": {
            "description": "When a PENDING_APPROVAL item goes stale; null in any other state.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/ProviderPoolRebuildStateEnum"
          },
          "supersededById": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "swappedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "tapName": {
            "description": "The platform tap's name.",
            "maxLength": 80,
            "minLength": 1,
            "pattern": "^[a-z][a-z0-9_]*$",
            "type": "string"
          },
          "targetLayoutId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantConnectorId": {
            "description": "The connection the Tap belongs to (PARABLE-5350).",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantConnectorTapId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "connectorId",
          "tapName",
          "effectiveTapId",
          "tenantConnectorTapId",
          "tenantConnectorId",
          "state",
          "reasons",
          "fromLayoutId",
          "targetLayoutId",
          "classification",
          "classificationHash",
          "identityImpact",
          "rebuildTableIds",
          "requestedBy",
          "requestedAt",
          "stale"
        ],
        "type": "object"
      },
      "TenantPublic": {
        "description": "Authentication Types\nMinimal public-facing tenant info, safe to expose pre-auth.\nReturned by `lookupTenantsByEmail` so the login surface on\n`app.parable.work` can surface tenant identity to the user without\ndivulging anything beyond what a logo on a public marketing page\nalready does. No IDs, no membership, no permissions.",
        "properties": {
          "logo": {
            "description": "Transparent PNG logo image",
            "nullable": true,
            "type": "object"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "slug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "name"
        ],
        "type": "object"
      },
      "TenantTableMaintenanceRunsResponse": {
        "properties": {
          "runs": {
            "items": {
              "$ref": "#/components/schemas/TableMaintenanceResult"
            },
            "type": "array"
          },
          "runsVersion": {
            "type": "string"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantId",
          "runsVersion",
          "runs"
        ],
        "type": "object"
      },
      "TenantTableQualityResultsResponse": {
        "properties": {
          "results": {
            "items": {
              "$ref": "#/components/schemas/TableQualityResult"
            },
            "type": "array"
          },
          "resultsVersion": {
            "type": "string"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantId",
          "resultsVersion",
          "results"
        ],
        "type": "object"
      },
      "TenantTableShapeStatsResponse": {
        "description": "Web-api maintenance proxy types.\nTableShapeStats / ColumnShapeStats / TableSpcResult / SpcSeriesResult /\nSpcRuleViolation / TableQualityResult / QualityCheckResult /\nQualityCheckSpec / QualityCheckEvidence / TableMaintenanceResult are\ndefined canonically in platform-schemas/services/dataplane-maintenance/.\nservices/provider-transformations queue jobs write them through\nparable-dataplane-quality-rs, and this schema imports them through the\n`dataplane-maintenance` schema dependency.\nOnly the tenant-scoped bulk response wrappers live here; they carry\nthe web-api-specific *Version fields and bundle the canonical result\ntypes for the proxy surface.",
        "properties": {
          "stats": {
            "items": {
              "$ref": "#/components/schemas/TableShapeStats"
            },
            "type": "array"
          },
          "statsVersion": {
            "type": "string"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantId",
          "statsVersion",
          "stats"
        ],
        "type": "object"
      },
      "TenantTableSpcResultsResponse": {
        "properties": {
          "results": {
            "items": {
              "$ref": "#/components/schemas/TableSpcResult"
            },
            "type": "array"
          },
          "resultsVersion": {
            "type": "string"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantId",
          "resultsVersion",
          "results"
        ],
        "type": "object"
      },
      "TenantUser": {
        "description": "A user object from the point of view of a specific Tenant. Projects\nweb-db TenantUser; joined user/role fields are @virtual.",
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "locale": {
            "description": "User's preferred locale in BCP 47 format (e.g., \"en-US\").",
            "maxLength": 35,
            "nullable": true,
            "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-[A-Z]{2})?$",
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "requireStrongAuth": {
            "description": "Whether this tenant membership requires strong authentication (e.g. OAuth).",
            "type": "boolean"
          },
          "roles": {
            "description": "Roles assigned to this user on this tenant. Each role carries its own\ninline permissions; aggregate via hasPermission(roles, perm).",
            "items": {
              "$ref": "#/components/schemas/Role"
            },
            "type": "array"
          },
          "status": {
            "$ref": "#/components/schemas/TenantUserStatus",
            "description": "Current membership status (ACTIVE, PENDING, SUSPENDED, REVOKED)."
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "timezone": {
            "description": "User's preferred timezone in IANA format (e.g., \"America/New_York\").",
            "maxLength": 100,
            "nullable": true,
            "pattern": "^(?:UTC|GMT|[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z][A-Za-z0-9_+-]*)+)$",
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "email",
          "name",
          "roles",
          "status",
          "requireStrongAuth",
          "tenantId"
        ],
        "type": "object"
      },
      "TenantUserInvite": {
        "properties": {
          "claimedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "claimedBy": {
            "description": "UUID v4 string as base62",
            "nullable": true,
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "expiresAt": {
            "description": "When this invitation expires.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revokedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "revokedBy": {
            "description": "UUID v4 string as base62",
            "nullable": true,
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "roles": {
            "description": "Roles the invited user will receive on claim. Each role carries its own\ninline permissions.",
            "items": {
              "$ref": "#/components/schemas/Role"
            },
            "type": "array"
          },
          "status": {
            "$ref": "#/components/schemas/TenantUserInviteStatus",
            "description": "Current status of the invitation."
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "email",
          "roles",
          "status",
          "expiresAt"
        ],
        "type": "object"
      },
      "TenantUserInviteStatus": {
        "description": "=====================================================\nTenant User Invite Status Enum\n=====================================================\nStatus of an invitation to join a tenant.",
        "enum": [
          "PENDING",
          "CLAIMED",
          "REVOKED",
          "EXPIRED"
        ],
        "type": "string"
      },
      "TenantUserStatus": {
        "description": "=====================================================\nTenant User Status Enum\n=====================================================\nStatus of a user's membership within a tenant.",
        "enum": [
          "PENDING",
          "ACTIVE",
          "SUSPENDED",
          "REVOKED"
        ],
        "type": "string"
      },
      "TestConnectionCompleteInput": {
        "properties": {
          "code": {
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "type": "object"
      },
      "TestConnectionStartInput": {
        "properties": {
          "redirectUri": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          }
        },
        "required": [
          "redirectUri"
        ],
        "type": "object"
      },
      "TestConnectionStartResult": {
        "properties": {
          "authorizationUrl": {
            "description": "Valid HTTP/HTTPS URL",
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "authorizationUrl",
          "state"
        ],
        "type": "object"
      },
      "TimelineGapsRule": {
        "properties": {
          "maxGapDays": {
            "description": "Signed integer count of days: an amount of elapsed time, never a point in time or a calendar date.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "maxGapDays"
        ],
        "type": "object"
      },
      "TimestampCoverageRule": {
        "properties": {
          "minRate": {
            "format": "double",
            "type": "number"
          },
          "type": {
            "$ref": "#/components/schemas/QualityRuleTypeEnum"
          }
        },
        "required": [
          "type",
          "minRate"
        ],
        "type": "object"
      },
      "TokenEndpointAuthMethod": {
        "description": "How client credentials are sent to the OAuth2 token endpoint.",
        "enum": [
          "client_secret_basic",
          "client_secret_post",
          "none",
          "basic_credentials"
        ],
        "type": "string"
      },
      "ToolActivityStatusEnum": {
        "enum": [
          "pending",
          "running",
          "completed",
          "failed"
        ],
        "type": "string"
      },
      "ToolActivityView": {
        "description": "Safe product-level Tool activity; provider stream chunks never enter Problem history.",
        "properties": {
          "completedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "externalToolCall": {
            "$ref": "#/components/schemas/ExternalToolCallRef"
          },
          "inputSummary": {
            "description": "Bounded reader-safe JSON summary; raw model arguments never enter Problem history.",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "name": {
            "description": "Generated MCP display name. Null only on retained pre-MCP history.",
            "maxLength": 160,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "outputSummary": {
            "description": "Bounded reader-safe JSON summary; raw Provider and authorized resource payloads stay private.",
            "maxLength": 2048,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "startedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ToolActivityStatusEnum"
          }
        },
        "required": [
          "externalToolCall",
          "status"
        ],
        "type": "object"
      },
      "ToolApprovalDecisionEnum": {
        "enum": [
          "approved",
          "denied",
          "cancelled"
        ],
        "type": "string"
      },
      "ToolApprovalStateEnum": {
        "enum": [
          "pending",
          "decided"
        ],
        "type": "string"
      },
      "ToolApprovalView": {
        "properties": {
          "approvalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "decidedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "decision": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ToolApprovalDecisionEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "requestedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/ToolApprovalStateEnum"
          }
        },
        "required": [
          "approvalId",
          "state",
          "requestedAt"
        ],
        "type": "object"
      },
      "ToolCallMessageCausationRef": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/ProblemMessageCausationKindEnum"
          },
          "toolCall": {
            "$ref": "#/components/schemas/ExternalToolCallRef"
          }
        },
        "required": [
          "kind",
          "toolCall"
        ],
        "type": "object"
      },
      "TransformationDatasetHealthState": {
        "description": "Class-aware health state projected for pipeline diagnostics.",
        "enum": [
          "healthy",
          "degraded",
          "failed",
          "stale_but_valid",
          "insufficient_data",
          "not_connected"
        ],
        "type": "string"
      },
      "UnenrollDeviceInput": {
        "description": "Device-facing self-revoke (PARABLE-7162). The device proves possession of\nits registered key with the same ES256 proof as re-key and the routing\ntoken refresh. Signature base: `v1:unenroll:{deviceRef}:{timestamp}`,\nsigned by the device's currently registered key.",
        "properties": {
          "deviceRef": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "signature": {
            "description": "base64 of the 64-byte ES256 signature (r || s) over the base string.",
            "type": "string"
          },
          "timestamp": {
            "description": "Unix epoch seconds at signing time (replay window enforced).",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "deviceRef",
          "timestamp",
          "signature"
        ],
        "type": "object"
      },
      "UnpublishArtifactInput": {
        "description": "Input for unpublishing a TenantArtifact. Resolves the artifact-derived\nTenantConnectorTap via `artifactId` and\nsoft-deletes both atomically. Idempotent: a second call returns 404\nARTIFACT_NOT_PUBLISHED.",
        "properties": {
          "artifactId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "artifactId"
        ],
        "type": "object"
      },
      "UnpublishArtifactResult": {
        "description": "Result of unpublishing a TenantArtifact. Returns the ids of the\nsoft-deleted tap and contract for caller bookkeeping.",
        "properties": {
          "contractId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tapId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tapId",
          "contractId"
        ],
        "type": "object"
      },
      "UpdateAgentSkillInput": {
        "properties": {
          "content": {
            "description": "Markdown text",
            "maxLength": 65536,
            "minLength": 1,
            "pattern": "^[\\s\\S]*$",
            "type": "string"
          },
          "description": {
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "displayTitle": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "expectedRevision": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "files": {
            "items": {
              "$ref": "#/components/schemas/AgentSkillFile"
            },
            "maxItems": 400,
            "minItems": 0,
            "type": "array"
          },
          "icon": {
            "description": "Serialized icon spec: a Font Awesome pack/weight/fill/name, an emoji, or an asset URL",
            "maxLength": 2048,
            "minLength": 1,
            "pattern": "^(?:fa:[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+-[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*(?:@#[0-9a-f]{6})?|emoji:\\S+|image:\\S+)$",
            "type": "string"
          },
          "name": {
            "description": "Portable Agent Skills directory and frontmatter name",
            "maxLength": 64,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          }
        },
        "required": [
          "displayTitle",
          "name",
          "icon",
          "description",
          "content",
          "files",
          "expectedRevision"
        ],
        "type": "object"
      },
      "UpdateArtifactDataSchemaInput": {
        "description": "Input for replacing the data schema on an existing artifact.",
        "properties": {
          "artifactId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "dataSchema": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          }
        },
        "required": [
          "artifactId",
          "dataSchema"
        ],
        "type": "object"
      },
      "UpdateArtifactInput": {
        "description": "Patch input for updating mutable fields on an existing artifact. Fields\nomitted are left unchanged; passing `path: null` explicitly moves the\nartifact to the tenant root.",
        "properties": {
          "fileName": {
            "nullable": true,
            "type": "string"
          },
          "path": {
            "description": "Hierarchical path expressed as a dot-separated ltree (e.g., 'reports.q1.draft').",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "UpdateTenantConnectorTapInput": {
        "description": "Patch input for updating an existing tenant connector tap. Same optional\nfields as create's nested `tap` body so both paths validate through one\nshape (PARABLE-2165).",
        "properties": {
          "canonicalPersonSource": {
            "description": "Mark this tap as one of the Workspace's canonical person/identity\nsources. Any number of active taps may carry the designation; ordering\namong canonical sources is by tap creation time, earlier wins.\nNull on create = false. Null on update = leave unchanged.",
            "nullable": true,
            "type": "boolean"
          },
          "config": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TenantConnectorTapConfig"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "description": {
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "nullable": true,
            "type": "boolean"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "nullable": true,
            "type": "object"
          }
        },
        "type": "object"
      },
      "UpdateTenantUserRolesInput": {
        "properties": {
          "roleIds": {
            "description": "Role IDs to assign. Replaces all existing role assignments.",
            "items": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "roleIds"
        ],
        "type": "object"
      },
      "UpdateTenantUserStatusInput": {
        "properties": {
          "status": {
            "$ref": "#/components/schemas/TenantUserStatus",
            "description": "The new status for the tenant user."
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "UpdateUserInput": {
        "description": "Input for users to update their own profile",
        "properties": {
          "locale": {
            "description": "BCP 47 language tag (e.g., en-US, fr-FR)",
            "maxLength": 35,
            "nullable": true,
            "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-[A-Z]{2})?$",
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "timezone": {
            "description": "IANA tz database name: UTC, GMT, or two or more '/'-separated segments of ASCII letters, digits, '_', '-', and '+', each starting with a letter (e.g., America/New_York, America/Port-au-Prince, Etc/GMT+5). Checks the name's shape, not that a tz release lists it.",
            "maxLength": 100,
            "nullable": true,
            "pattern": "^(?:UTC|GMT|[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z][A-Za-z0-9_+-]*)+)$",
            "type": "string"
          },
          "title": {
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "UserBase": {
        "description": "The base info about a user. id stays Identity.UserID (not Auditable's\nIdentity.UUID) so the wire/auth contract keeps the actor scalar.",
        "properties": {
          "avatarUrl": {
            "description": "Profile picture URL. Mirrors User.avatar.url (custom upload, re-hosted OAuth\navatar, or the provider `picture` claim). Null for email-code signups; the UI\nfalls back to an initials avatar.",
            "format": "uri",
            "maxLength": 2048,
            "nullable": true,
            "pattern": "^https?://[\\w\\-\\{\\}]+(\\.[\\w\\-\\{\\}]+)+([:/?#][\\w\\-\\._~:/?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\{\\}%]*)?$",
            "type": "string"
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "locale": {
            "description": "BCP 47 language tag (e.g., en-US, fr-FR)",
            "maxLength": 35,
            "nullable": true,
            "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-[A-Z]{2})?$",
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "staffRoles": {
            "description": "Staff/platform-level roles assigned via StaffUserRole. Each role carries\nits own inline permissions; aggregate via hasPermission(staffRoles, perm).",
            "items": {
              "$ref": "#/components/schemas/Role"
            },
            "type": "array"
          },
          "timezone": {
            "description": "IANA tz database name: UTC, GMT, or two or more '/'-separated segments of ASCII letters, digits, '_', '-', and '+', each starting with a letter (e.g., America/New_York, America/Port-au-Prince, Etc/GMT+5). Checks the name's shape, not that a tz release lists it.",
            "maxLength": 100,
            "nullable": true,
            "pattern": "^(?:UTC|GMT|[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z][A-Za-z0-9_+-]*)+)$",
            "type": "string"
          },
          "title": {
            "nullable": true,
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "userOnboardingCompletedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "welcomeSeenAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "email",
          "staffRoles"
        ],
        "type": "object"
      },
      "UserInfo": {
        "description": "A type for general info about a user for returning enough public facing\nuser info for fields like createdBy or updatedBy.",
        "properties": {
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "email"
        ],
        "type": "object"
      },
      "UserTenantPermissions": {
        "description": "A users permissions on a specific tenant",
        "properties": {
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "roles": {
            "description": "Workspace roles for this user. Each role carries its own permissions.\nThese do not summarize effective access: user.staffRoles can independently\ngrant an operation, and the target resource still applies its policies.\nAn entry with a zero Id supplies staff Workspace context without a membership.",
            "items": {
              "$ref": "#/components/schemas/Role"
            },
            "type": "array"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tenantKind": {
            "description": "What the Workspace is for (EDR-0093), shown as a DEMO or DOGFOOD badge in\nthe Workspace switcher. Null on synthesized admin-tenant-view entries,\nwhich carry no tenant record.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TenantKind"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "tenantLogo": {
            "description": "Workspace logo shown beside its name in the Workspace switcher.",
            "nullable": true,
            "type": "object"
          },
          "tenantName": {
            "description": "Display name of the tenant, for UI affordances like the workspace\nswitcher. Nullable because synthesized admin-tenant-view entries carry\nonly the slug from request context, not a tenant record.",
            "maxLength": 80,
            "minLength": 2,
            "nullable": true,
            "type": "string"
          },
          "tenantOnboardingCompletedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "tenantSlug": {
            "description": "A URL friendly version of a string",
            "maxLength": 17,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "type": "string"
          },
          "updatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "createdBy",
          "updatedAt",
          "updatedBy",
          "roles",
          "tenantId",
          "tenantSlug"
        ],
        "type": "object"
      },
      "UserWithPermissions": {
        "description": "An authenticated user with their base info and\ntheir permissions per tenant",
        "properties": {
          "impersonatedTenantId": {
            "description": "The tenant being impersonated into. The frontend uses this to select the correct tenant context.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "impersonatingUser": {
            "description": "When isImpersonating is true, the FTE who initiated impersonation (for banner display).",
            "oneOf": [
              {
                "$ref": "#/components/schemas/UserBase"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "permissions": {
            "items": {
              "$ref": "#/components/schemas/UserTenantPermissions"
            },
            "type": "array"
          },
          "user": {
            "$ref": "#/components/schemas/UserBase"
          }
        },
        "required": [
          "user",
          "permissions"
        ],
        "type": "object"
      },
      "ValidateCredentialsInput": {
        "description": "Input for validating stored credentials.",
        "properties": {
          "credentialMetadataId": {
            "description": "The credential metadata ID to validate.",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "credentialMetadataId"
        ],
        "type": "object"
      },
      "ValidateCredentialsResult": {
        "description": "Result of credential validation.",
        "properties": {
          "details": {
            "description": "Additional details about the validation (e.g., available scopes, user info).",
            "nullable": true
          },
          "errorCode": {
            "description": "Error category when validation fails. Null when success is true.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ValidationErrorCode"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          },
          "message": {
            "description": "Human-readable message about the validation result.",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/CredentialStatus",
            "description": "Updated credential status after validation."
          },
          "success": {
            "description": "Whether the validation was successful (credentials work).",
            "type": "boolean"
          },
          "validatedAt": {
            "description": "When the validation was performed.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "success",
          "status"
        ],
        "type": "object"
      },
      "ValidationErrorCode": {
        "description": "Error category when credential validation fails.",
        "enum": [
          "auth_failed",
          "internal_error",
          "insufficient_permissions",
          "expired",
          "config_invalid"
        ],
        "type": "string"
      },
      "ValidationRateAnnotation": {
        "properties": {
          "invalid_count": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "invalid_rate": {
            "description": "Probability value from 0.0 to 1.0 inclusive",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "total_count": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "invalid_count",
          "total_count",
          "invalid_rate"
        ],
        "type": "object"
      },
      "VendorWithConnectors": {
        "description": "Vendor with its connector instances (tenant-scoped).\nReturned only for vendors that have at least one configured connector.",
        "properties": {
          "connectorInstances": {
            "description": "Connector instances configured for this vendor",
            "items": {
              "$ref": "#/components/schemas/TenantConnectorInstance"
            },
            "type": "array"
          },
          "vendor": {
            "$ref": "#/components/schemas/ParableVendor",
            "description": "The vendor"
          }
        },
        "required": [
          "vendor",
          "connectorInstances"
        ],
        "type": "object"
      },
      "VendorsPaginatedResponse": {
        "description": "ParableVendor API Types\nThese types are used for the connector catalog browsing experience.\nThey wrap the DB types with computed fields for frontend display.\nPaginated response for listing parable vendors.",
        "properties": {
          "items": {
            "description": "The paginated vendor records",
            "items": {
              "$ref": "#/components/schemas/ParableVendor"
            },
            "type": "array"
          },
          "limit": {
            "description": "The limit used for this request",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "offset": {
            "description": "The offset used for this request",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "total": {
            "description": "Total count of all matching records (for pagination UI)",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "VerifyEmailCodeInput": {
        "properties": {
          "code": {
            "type": "string"
          },
          "email": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "returnTo": {
            "description": "Optional post-auth landing URL. Same shape, contract, scalar choice\n(plain string, not Url) and validateReturnTo treatment as\nSignupTenantInput.returnTo.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "email",
          "code"
        ],
        "type": "object"
      },
      "WebApiArtifactError": {
        "description": "web-api artifact upload errors",
        "enum": [
          "WA-AF-001",
          "WA-AF-002",
          "WA-AF-003",
          "WA-AF-004",
          "WA-AF-005",
          "WA-AF-006",
          "WA-AF-007",
          "WA-AF-008",
          "WA-AF-009",
          "WA-AF-010",
          "WA-AF-011",
          "WA-AF-012",
          "WA-AF-013",
          "WA-AF-014",
          "WA-AF-015",
          "WA-AF-016",
          "WA-AF-017",
          "WA-AF-018"
        ],
        "type": "string"
      },
      "WorkFunction": {
        "description": "Functional area of the signing-up user inside their organization.",
        "enum": [
          "PRODUCT",
          "ENGINEERING",
          "OPERATIONS",
          "FINANCE",
          "PEOPLE",
          "REVENUE",
          "MARKETING",
          "LEGAL",
          "SECURITY"
        ],
        "type": "string"
      },
      "WorkRole": {
        "description": "Seniority level of the signing-up user inside their organization.",
        "enum": [
          "IC",
          "MANAGER",
          "DIRECTOR",
          "EXECUTIVE",
          "C_SUITE"
        ],
        "type": "string"
      },
      "WorkspaceApiToken": {
        "description": "A personal access token a Workspace member created in this Workspace, for\nSQL over Flight or for an MCP host (PARABLE-4943, PARABLE-5373). Metadata\nonly: the token's value is returned once, by createApiToken, and its hash\nnever.",
        "properties": {
          "audience": {
            "$ref": "#/components/schemas/ApiTokenAudienceEnum",
            "description": "Where the token works: flight_sql (SQL over Flight only) or mcp (the\nWorkspace API's read-only operations only). Never all."
          },
          "createdAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "expiresAt": {
            "description": "When the token stops working. Every token a member creates has one.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lastUsedAt": {
            "description": "The last time the token authenticated a request. Null when never used.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "The label its owner gave it, such as \"DBeaver on my laptop\".",
            "type": "string"
          },
          "ownerEmail": {
            "description": "An email address",
            "format": "email",
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
            "type": "string"
          },
          "ownerName": {
            "description": "An objects name",
            "maxLength": 80,
            "minLength": 2,
            "type": "string"
          },
          "ownerUserId": {
            "description": "The member the token belongs to and acts as.",
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          },
          "prefix": {
            "description": "The token's first 12 characters, pat_ included, to tell tokens apart.",
            "type": "string"
          },
          "revokedAt": {
            "description": "When the token was revoked. A revoked token is kept for the record and\nrefused.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "createdAt",
          "name",
          "prefix",
          "audience",
          "ownerUserId",
          "ownerName",
          "ownerEmail"
        ],
        "type": "object"
      },
      "WorkspaceModelPolicy": {
        "description": "A Workspace's AI model policy as its administrators see it\n(PARABLE-4670): the stored choices and the effective policy web-api\ncomputes from them. Staff own the ceiling and the Vertex project; the\nWorkspace owns the narrowing and the defaults.",
        "properties": {
          "capabilityDefaults": {
            "description": "The Workspace's default model per capability.",
            "items": {
              "$ref": "#/components/schemas/ModelCapabilityDefault"
            },
            "type": "array"
          },
          "disabledProcessors": {
            "description": "Processors the Workspace switched off.",
            "items": {
              "$ref": "#/components/schemas/ModelProcessor"
            },
            "type": "array"
          },
          "effective": {
            "$ref": "#/components/schemas/EffectiveModelPolicy",
            "description": "What every AI call over the Workspace's data applies."
          },
          "eligibleProcessors": {
            "description": "The staff ceiling. Null means staff set none; an empty list means no\nprocessor may receive the Workspace's data.",
            "items": {
              "$ref": "#/components/schemas/ModelProcessor"
            },
            "nullable": true,
            "type": "array"
          },
          "features": {
            "description": "The product feature each capability serves, from the environment policy.",
            "items": {
              "$ref": "#/components/schemas/ModelCapabilityFeature"
            },
            "type": "array"
          },
          "processors": {
            "description": "Every processor the environment lists for any capability, in processor\norder, with its terms and what it serves for the Workspace (PARABLE-4676).",
            "items": {
              "$ref": "#/components/schemas/WorkspaceModelProcessor"
            },
            "type": "array"
          },
          "settableDefaults": {
            "description": "The capabilities the Workspace may set a default for, in capability\norder, with the kind of choice each takes. setModelPreferences refuses a\ndefault for any other capability.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceSettableDefault"
            },
            "type": "array"
          },
          "vertexProject": {
            "description": "The Workspace's Parable-owned Vertex project, set by staff. Null means\nthe environment's shared project.",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "disabledProcessors",
          "capabilityDefaults",
          "effective",
          "processors",
          "features",
          "settableDefaults"
        ],
        "type": "object"
      },
      "WorkspaceModelProcessor": {
        "description": "One AI processor as a Workspace's administrators see it (PARABLE-4676):\nwhat it is, its terms, and what it serves for the Workspace. web-api\ncomputes every field; the page never works out eligibility itself.",
        "properties": {
          "capabilities": {
            "description": "The capabilities this environment lets the processor serve, within the\nstaff ceiling, whether or not the Workspace switched it off. Empty when\nthe ceiling excludes it.",
            "items": {
              "$ref": "#/components/schemas/ModelCapability"
            },
            "type": "array"
          },
          "eligibleCapabilities": {
            "description": "The capabilities it serves for the Workspace now: the ones above, unless\nthe Workspace switched it off.",
            "items": {
              "$ref": "#/components/schemas/ModelCapability"
            },
            "type": "array"
          },
          "ponderServer": {
            "description": "The ponder() server that sends a call to this processor, for a\nSQL_MODEL default. Null when ponder() cannot reach it.",
            "nullable": true,
            "type": "string"
          },
          "processor": {
            "$ref": "#/components/schemas/ModelProcessor"
          },
          "switchedOff": {
            "description": "Whether the Workspace switched it off.",
            "type": "boolean"
          },
          "terms": {
            "description": "What the processor is and its retention terms, from the environment\npolicy. Null when the environment records none for it.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ModelProcessorTerms"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "withinCeiling": {
            "description": "Whether the staff ceiling allows it. The Workspace can switch a\nprocessor off, and back on, only inside the ceiling.",
            "type": "boolean"
          }
        },
        "required": [
          "processor",
          "capabilities",
          "eligibleCapabilities",
          "withinCeiling",
          "switchedOff"
        ],
        "type": "object"
      },
      "WorkspaceParableArchiveImportChange": {
        "description": "One row the import changes: a Piece, or a Schedule, Report or Report Plan.\n`pieceId` is that row's stable key; the paths are null for the rows that have\nno file.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/ParableArchiveImportActionEnum"
          },
          "kind": {
            "$ref": "#/components/schemas/ParableArchiveChangeKindEnum"
          },
          "newPath": {
            "description": "A file system path",
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "oldPath": {
            "description": "A file system path",
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "pieceId",
          "kind",
          "action"
        ],
        "type": "object"
      },
      "WorkspaceParableArchiveImportDiagnostic": {
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "path": {
            "description": "A file system path",
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "pieceId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "severity": {
            "$ref": "#/components/schemas/ParableArchiveImportDiagnosticSeverityEnum"
          }
        },
        "required": [
          "code",
          "severity",
          "message"
        ],
        "type": "object"
      },
      "WorkspaceParableArchiveImportPlan": {
        "properties": {
          "applicable": {
            "type": "boolean"
          },
          "archiveSha256": {
            "type": "string"
          },
          "baseVersion": {
            "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "changes": {
            "items": {
              "$ref": "#/components/schemas/WorkspaceParableArchiveImportChange"
            },
            "minItems": 0,
            "type": "array"
          },
          "diagnostics": {
            "items": {
              "$ref": "#/components/schemas/WorkspaceParableArchiveImportDiagnostic"
            },
            "minItems": 0,
            "type": "array"
          },
          "planDigest": {
            "type": "string"
          },
          "proposalId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rootRefId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "warnings": {
            "description": "Lab app source that sends SQL to a pool a reader with a Peeking seat\ncannot read from the app (PARABLE-7230). Empty for a structured archive.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceParableArchiveImportWarning"
            },
            "minItems": 0,
            "type": "array"
          }
        },
        "required": [
          "rootRefId",
          "baseVersion",
          "archiveSha256",
          "planDigest",
          "applicable",
          "changes",
          "diagnostics",
          "warnings"
        ],
        "type": "object"
      },
      "WorkspaceParableArchiveImportWarning": {
        "description": "A place in a Lab app's source that sends SQL to a pool a reader with a\nPeeking seat cannot read from the app (PARABLE-7230). SQL in a Parable reads\nonly its Plots for such a reader, so that call is refused for them. A\ndeclared Plot fixes it. A warning never blocks the import.",
        "properties": {
          "line": {
            "description": "The 1-based line of the file that names the pool.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "message": {
            "type": "string"
          },
          "path": {
            "description": "The package path of the app file.",
            "minLength": 1,
            "type": "string"
          },
          "pool": {
            "$ref": "#/components/schemas/CatalogPoolEnum"
          }
        },
        "required": [
          "path",
          "line",
          "pool",
          "message"
        ],
        "type": "object"
      },
      "WorkspaceProviderPolicies": {
        "properties": {
          "canManage": {
            "description": "Whether the person reading may change Provider Policies.",
            "type": "boolean"
          },
          "roles": {
            "description": "Every role a rule can bind, then any other role a stored rule names, by\nname.",
            "items": {
              "$ref": "#/components/schemas/ProviderPolicyRole"
            },
            "type": "array"
          },
          "tables": {
            "description": "Every main and child Provider table the Workspace's catalog serves, by\nschema and name.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceProviderPolicyTable"
            },
            "type": "array"
          },
          "unmatched": {
            "description": "Stored Policies on tables the catalog no longer serves. A new tap or a\nre-created custom tap gives a table a new key, so such a Policy applies\nto nothing; it can still be cleared.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceProviderPolicyTable"
            },
            "type": "array"
          }
        },
        "required": [
          "tables",
          "unmatched",
          "roles",
          "canManage"
        ],
        "type": "object"
      },
      "WorkspaceProviderPolicyTable": {
        "description": "One Provider table on the Workspace's Provider Policies page.",
        "properties": {
          "columns": {
            "description": "The table's columns. Empty for a table the catalog no longer serves.",
            "items": {
              "$ref": "#/components/schemas/ProviderPolicyColumn"
            },
            "type": "array"
          },
          "logicalName": {
            "type": "string"
          },
          "modeled": {
            "description": "Whether the table is modeled (EDR-0095): its Provider says who can open\neach row. Only a modeled table takes a Source permissions rule. False for\na table the catalog no longer serves.",
            "type": "boolean"
          },
          "parentTableKey": {
            "description": "For a child table, its main table's key. A child table takes its own\nProvider Policy.",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "policy": {
            "description": "Null when the table has no Provider Policy.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProviderPolicyRecord"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "object"
              }
            ]
          },
          "problems": {
            "description": "What stops the stored Policy from applying as written, such as a\ncondition that names a column the table no longer has. Until it is\nfixed, a read of the table by anyone that Policy narrows fails.",
            "items": {
              "$ref": "#/components/schemas/ProviderPolicyProblem"
            },
            "type": "array"
          },
          "providerKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "schemaName": {
            "type": "string"
          },
          "statsRowCount": {
            "description": "The catalog's row count. Null when unknown, and for a table a Provider\nPolicy narrows for the person reading the page: catalog statistics are\nwithheld from the people a Policy narrows.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "tableKey": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "tableKind": {
            "description": "Null for a stored Policy whose table the catalog no longer serves.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/CatalogTableKindEnum"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true,
                "type": "string"
              }
            ]
          }
        },
        "required": [
          "providerKey",
          "tableKey",
          "schemaName",
          "logicalName",
          "columns",
          "problems",
          "modeled"
        ],
        "type": "object"
      },
      "WorkspaceRefreshCostThreshold": {
        "properties": {
          "isPlatformDefault": {
            "description": "True when the Workspace set no threshold, so the platform default\napplies.",
            "type": "boolean"
          },
          "platformDefault": {
            "description": "US cents. The platform default the Workspace falls back to.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "tenantId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "threshold": {
            "description": "US cents. The change preview (PARABLE-5768) calls out a predicted cost of\nthe next Refresh above this amount: the Workspace's own threshold, or the\nplatform default when it set none.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "updatedAt": {
            "description": "Who set the Workspace's own threshold and when. Null while the platform\ndefault applies.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "nullable": true,
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "tenantId",
          "threshold",
          "platformDefault",
          "isPlatformDefault"
        ],
        "type": "object"
      },
      "WorkspaceSettableDefault": {
        "description": "A capability a Workspace may set its own default model for, and the one\nkind of choice that default takes (PARABLE-4676). Embedding models are\nplatform-only, so they never appear (PARABLE-4494 Decision 6).",
        "properties": {
          "capability": {
            "$ref": "#/components/schemas/ModelCapability"
          },
          "choiceKind": {
            "$ref": "#/components/schemas/ModelChoiceKind"
          }
        },
        "required": [
          "capability",
          "choiceKind"
        ],
        "type": "object"
      },
      "WorkspaceSourcePermissions": {
        "description": "A Workspace's source permissions settings (EDR-0095 D5 and D9,\nPARABLE-6141), on the Provider Policies page. A Workspace that never saved\nthem reads both as false at revision 0.",
        "properties": {
          "canManage": {
            "description": "Whether the person reading may change the settings.",
            "type": "boolean"
          },
          "enforced": {
            "description": "Source permissions are enforced: a table a connector models, with no\nProvider Policy, reads only the rows each reader may open in the source.\nA table with no model still reads All rows.",
            "type": "boolean"
          },
          "linkOnlyGrantsAdmit": {
            "description": "A link-only `domain` or `anyone` grant admits its audience. When false,\nsuch a grant admits nobody beyond the resource's other grants.",
            "type": "boolean"
          },
          "revision": {
            "description": "The compare-and-swap token: a save names it as expectedRevision. 0 while\nthe Workspace has never saved the settings.",
            "format": "int64",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "updatedAt": {
            "description": "Who last changed the settings, and when. Null at revision 0.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "updatedBy": {
            "description": "UUID v4 string as base62",
            "nullable": true,
            "pattern": "^[0-9A-Za-z]{1,22}$",
            "type": "string"
          }
        },
        "required": [
          "enforced",
          "linkOnlyGrantsAdmit",
          "revision",
          "canManage"
        ],
        "type": "object"
      },
      "WorkspaceSourcePermissionsExplanation": {
        "properties": {
          "explanation": {
            "$ref": "#/components/schemas/SourcePermissionsExplainResponse"
          },
          "person": {
            "$ref": "#/components/schemas/SourcePermissionsPerson"
          }
        },
        "required": [
          "person",
          "explanation"
        ],
        "type": "object"
      },
      "WorkspaceSourcePermissionsPreview": {
        "description": "What one person would read under source permissions: for each modeled\ntable, its rows and the rows the person can open in the Provider. Counts\nonly, never rows.",
        "properties": {
          "person": {
            "$ref": "#/components/schemas/SourcePermissionsPerson"
          },
          "tables": {
            "items": {
              "$ref": "#/components/schemas/SourcePermissionsPreviewTable"
            },
            "type": "array"
          }
        },
        "required": [
          "person",
          "tables"
        ],
        "type": "object"
      },
      "WritePublishedPlotSchemaInput": {
        "description": "Control-plane write-back for the result shape produced by one QueryRuns row.\nPublication identity is pinned so a delayed engine write cannot target a\ndifferent sealed Plot revision.",
        "properties": {
          "lastPinAt": {
            "description": "Pin-time watermark from the QueryRun pin set. Omitted on legacy clients.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "plotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "queryRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sealedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "plotId",
          "sealedCommitId",
          "queryRunId",
          "outputSchema"
        ],
        "type": "object"
      },
      "WritePublishedPlotSchemaResult": {
        "description": "Persisted engine-owned Plot schema state after publication write-back.",
        "properties": {
          "outputSchema": {
            "description": "A Parable Schema in JSON",
            "type": "object"
          },
          "outputSchemaUpdatedAt": {
            "description": "ISO8601 datetime string. Epoch wire values keep this scalar and declare x-temporal-format (unix, unix_millis, unix_micros, unix_nanos) on the property; the unit is never guessed from digit count.",
            "format": "date-time",
            "type": "string"
          },
          "plotId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "queryRunId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sealedCommitId": {
            "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
            "pattern": "^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updated": {
            "description": "False when this queryRunId was already applied and no row version changed.",
            "type": "boolean"
          }
        },
        "required": [
          "plotId",
          "sealedCommitId",
          "queryRunId",
          "outputSchema",
          "outputSchemaUpdatedAt",
          "updated"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "bearerFormat": "JWT",
        "scheme": "bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "description": "REST API generated from the web-api schema",
    "title": "Web-Api API",
    "version": "1.0.0"
  },
  "openapi": "3.0.3",
  "paths": {
    "/api/agent-skills": {
      "get": {
        "description": "Lists the Powers in this Workspace so you can find one. Open a specific Power to read its Markdown instructions; selecting it for a Message or Process is optional.",
        "operationId": "AgentSkillsListAgentSkillsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AgentSkillCatalogView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Powers",
        "tags": [
          "agent-skills"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.agent-skills.list",
          "description": "Lists the Powers in this Workspace so you can find one. Open a specific Power to read its Markdown instructions; selecting it for a Message or Process is optional.",
          "doNotUseWhen": "Do not use when you need the instructions for one specific Agent Skill.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder Agent Skills in this Workspace."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Workspace Agent Skill catalog.",
          "title": "List Powers",
          "useWhen": "Use when you need the Agent Skills available in this Workspace.",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Creates a reusable Power in this Workspace from its metadata and its Markdown instructions. A Power is instructions only: it grants no extra tools and no extra Workspace access.",
        "operationId": "AgentSkillsCreateAgentSkillHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateAgentSkillInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AgentSkill"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Create a Power",
        "tags": [
          "agent-skills"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.agent-skills.create",
          "description": "Creates a reusable Power in this Workspace from its metadata and its Markdown instructions. A Power is instructions only: it grants no extra tools and no extra Workspace access.",
          "doNotUseWhen": "Do not use when an existing Agent Skill needs changes.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Correct the name, metadata, instructions, or idempotency key.",
              "description": "The Agent Skill input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you can manage Parables.",
              "description": "You cannot manage Agent Skills in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Reuse the original request unchanged, or choose a new name and idempotency key for a deliberately new Skill.",
              "description": "The name is already used or the idempotency key belongs to different instructions."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the created Agent Skill.",
          "title": "Create a Power",
          "useWhen": "Use when you need to create a reusable Agent Skill.",
          "visibility": "internal"
        }
      }
    },
    "/api/agent-skills/{skillId}": {
      "get": {
        "description": "Returns one Power with its full Markdown instructions, for editing or use in Ponder Messages and Processes. Reading a Power does not require selecting it first. A Power belonging to another Workspace reads as missing.",
        "operationId": "AgentSkillsGetAgentSkillHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "skillId parameter",
            "in": "path",
            "name": "skillId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AgentSkill"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Power",
        "tags": [
          "agent-skills"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.agent-skills.get",
          "description": "Returns one Power with its full Markdown instructions, for editing or use in Ponder Messages and Processes. Reading a Power does not require selecting it first. A Power belonging to another Workspace reads as missing.",
          "doNotUseWhen": "Do not use when you only need to browse available Agent Skills.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Agent Skill identifier.",
              "description": "The Agent Skill identifier is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder Agent Skills in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose an Agent Skill returned by the current Workspace catalog.",
              "description": "The Agent Skill does not exist in this Workspace or is a retired built-in Skill."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the requested Agent Skill.",
          "title": "Read a Power",
          "useWhen": "Use when you need the full instructions for one Agent Skill.",
          "visibility": "internal"
        }
      },
      "patch": {
        "description": "Updates a Power's details and Markdown instructions. Accepted Ponder Messages and Process Runs retain their captured Power instructions.",
        "operationId": "AgentSkillsUpdateAgentSkillHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "skillId parameter",
            "in": "path",
            "name": "skillId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAgentSkillInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AgentSkill"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Update a Power",
        "tags": [
          "agent-skills"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.agent-skills.update",
          "description": "Updates a Power's details and Markdown instructions. Accepted Ponder Messages and Process Runs retain their captured Power instructions.",
          "doNotUseWhen": "Do not use to create a new Agent Skill.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid identifier and correct the update input.",
              "description": "The Agent Skill identifier or update input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you can manage Parables.",
              "description": "You cannot manage Agent Skills in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose an Agent Skill returned by the current Workspace catalog.",
              "description": "The Agent Skill does not exist in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Reload the Skill, preserve concurrent changes, and retry with the current revision and an unused name.",
              "description": "The Skill changed after the expected revision or another Skill uses the requested name."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Returns the updated Agent Skill.",
          "title": "Update a Power",
          "useWhen": "Use when you need to change an existing Agent Skill.",
          "visibility": "internal"
        }
      }
    },
    "/api/api-tokens/create": {
      "post": {
        "description": "Creates a personal access token in the selected Workspace and returns its value once. Its audience says where it works: flight_sql, the default, on SQL over Flight only, where every Workspace API route refuses it; mcp on the Workspace API's read-only operations only, for an MCP host such as Claude Code, where every operation that changes something and SQL over Flight refuse it. The token reaches this Workspace only and acts with your roles at the time of each request. It expires after the given number of days, 90 by default and 365 at most. Requires an active membership whose roles can query the Provider Pools, and is refused when the Workspace has turned tokens off or the request itself uses a token.",
        "operationId": "ApiTokensCreateApiTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateWorkspaceApiTokenInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CreateWorkspaceApiTokenResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Create a personal access token",
        "tags": [
          "api-tokens"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.access-tokens.create-api-token",
          "description": "Creates a personal access token in the selected Workspace and returns its value once. Its audience says where it works: flight_sql, the default, on SQL over Flight only, where every Workspace API route refuses it; mcp on the Workspace API's read-only operations only, for an MCP host such as Claude Code, where every operation that changes something and SQL over Flight refuse it. The token reaches this Workspace only and acts with your roles at the time of each request. It expires after the given number of days, 90 by default and 365 at most. Requires an active membership whose roles can query the Provider Pools, and is refused when the Workspace has turned tokens off or the request itself uses a token.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Create a personal access token",
          "visibility": "internal"
        }
      }
    },
    "/api/api-tokens/mine": {
      "get": {
        "description": "Lists the personal access tokens you created in the selected Workspace, for SQL and for MCP, newest first, with revoked and expired ones. It also says whether the Workspace allows tokens, and the default and longest expiry for a new one. Values are never returned. Requires permission to query the Provider Pools.",
        "operationId": "ApiTokensMyApiTokensHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MyWorkspaceApiTokens"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List your personal access tokens",
        "tags": [
          "api-tokens"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.access-tokens.my-api-tokens",
          "description": "Lists the personal access tokens you created in the selected Workspace, for SQL and for MCP, newest first, with revoked and expired ones. It also says whether the Workspace allows tokens, and the default and longest expiry for a new one. Values are never returned. Requires permission to query the Provider Pools.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List your personal access tokens",
          "visibility": "internal"
        }
      }
    },
    "/api/api-tokens/workspace": {
      "get": {
        "description": "Lists every personal access token the selected Workspace's members created, for SQL and for MCP, newest first, with each token's owner, and revoked and expired ones. Values are never returned. Requires permission to manage the Workspace's people.",
        "operationId": "ApiTokensWorkspaceApiTokensHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/WorkspaceApiToken"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List the Workspace's personal access tokens",
        "tags": [
          "api-tokens"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.access-tokens.workspace-api-tokens",
          "description": "Lists every personal access token the selected Workspace's members created, for SQL and for MCP, newest first, with each token's owner, and revoked and expired ones. Values are never returned. Requires permission to manage the Workspace's people.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List the Workspace's personal access tokens",
          "visibility": "internal"
        }
      }
    },
    "/api/api-tokens/{id}/revoke": {
      "post": {
        "description": "Revokes one of your personal access tokens in the selected Workspace: a Workspace API request that uses it is refused at once, and SQL over Flight refuses it within its 30-second authorization cache. Revoking a revoked token succeeds. A token that is not yours, or not in this Workspace, is not found.",
        "operationId": "ApiTokensRevokeMyApiTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Revoke your personal access token",
        "tags": [
          "api-tokens"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.access-tokens.revoke-my-api-token",
          "description": "Revokes one of your personal access tokens in the selected Workspace: a Workspace API request that uses it is refused at once, and SQL over Flight refuses it within its 30-second authorization cache. Revoking a revoked token succeeds. A token that is not yours, or not in this Workspace, is not found.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Revoke your personal access token",
          "visibility": "internal"
        }
      }
    },
    "/api/api-tokens/{id}/workspace-revoke": {
      "post": {
        "description": "Revokes any member's personal access token in the selected Workspace: a Workspace API request that uses it is refused at once, and SQL over Flight refuses it within its 30-second authorization cache. The revocation is recorded against the token's owner. Revoking a revoked token succeeds. Requires permission to manage the Workspace's people.",
        "operationId": "ApiTokensRevokeWorkspaceApiTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Revoke a member's personal access token",
        "tags": [
          "api-tokens"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.access-tokens.revoke-workspace-api-token",
          "description": "Revokes any member's personal access token in the selected Workspace: a Workspace API request that uses it is refused at once, and SQL over Flight refuses it within its 30-second authorization cache. The revocation is recorded against the token's owner. Revoking a revoked token succeeds. Requires permission to manage the Workspace's people.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Revoke a member's personal access token",
          "visibility": "internal"
        }
      }
    },
    "/api/artifact-publications/actions/activate": {
      "post": {
        "description": "Makes a revision the active publication of its namespace in one transaction. A staged revision activates when every declared table finished ingestion and its expected base is still active. A READY revision activates only when expectedActiveRevisionId names the current active revision; this switches back to the previous revision. The revision it replaces is kept for rollback, and cleanup is queued for older revisions.",
        "operationId": "ArtifactsActivateArtifactPublicationHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActivateArtifactPublicationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactPublicationReceipt"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Activate a publication",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.activate-publication",
          "description": "Makes a revision the active publication of its namespace in one transaction. A staged revision activates when every declared table finished ingestion and its expected base is still active. A READY revision activates only when expectedActiveRevisionId names the current active revision; this switches back to the previous revision. The revision it replaces is kept for rollback, and cleanup is queued for older revisions.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Activate a publication",
          "visibility": "internal"
        }
      }
    },
    "/api/artifact-publications/actions/delete": {
      "post": {
        "description": "Deletes the namespace in the selected Workspace: queries stop serving it, its slug becomes free for a new namespace, and cleanup of every stored input and table output is queued. Cleanup waits for outstanding upload grants to expire. Receipts, activations, selections, and worker callbacks for the deleted namespace fail.",
        "operationId": "ArtifactsDeleteArtifactPublicationHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArtifactPublicationNamespaceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactPublicationNamespaceResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Delete a publication namespace",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.delete-publication",
          "description": "Deletes the namespace in the selected Workspace: queries stop serving it, its slug becomes free for a new namespace, and cleanup of every stored input and table output is queued. Cleanup waits for outstanding upload grants to expire. Receipts, activations, selections, and worker callbacks for the deleted namespace fail.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Delete a publication namespace",
          "visibility": "internal"
        }
      }
    },
    "/api/artifact-publications/actions/finalize": {
      "post": {
        "description": "Queues durable processing for every uploaded table in the selected revision. Replays reuse current jobs; an explicit retry resumes unchanged failed inputs. The active publication remains available while processing runs.",
        "operationId": "ArtifactsFinalizeArtifactPublicationHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FinalizeArtifactPublicationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactPublicationReceipt"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Process publication uploads",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.finalize-publication",
          "description": "Queues durable processing for every uploaded table in the selected revision. Replays reuse current jobs; an explicit retry resumes unchanged failed inputs. The active publication remains available while processing runs.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Process publication uploads",
          "visibility": "internal"
        }
      }
    },
    "/api/artifact-publications/actions/remove-revision": {
      "post": {
        "description": "Removes a staged or failed revision that is not active in the selected Workspace and queues cleanup of the storage no retained revision still uses. A removed revision can no longer be read, selected, or activated.",
        "operationId": "ArtifactsRemoveArtifactPublicationRevisionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArtifactPublicationSelection"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactPublicationRevisionResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Remove a publication revision",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.remove-publication-revision",
          "description": "Removes a staged or failed revision that is not active in the selected Workspace and queues cleanup of the storage no retained revision still uses. A removed revision can no longer be read, selected, or activated.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Remove a publication revision",
          "visibility": "internal"
        }
      }
    },
    "/api/artifact-publications/actions/reserve": {
      "post": {
        "description": "Reserves the entire table inventory in the selected Workspace and returns direct upload grants. Each table declares its name, input format, size, SHA-256 and row count; the worker derives its schema when it analyses the upload. Reusing a revision ID requires an identical declaration; a replacement names the expected active revision. A table whose name, input SHA-256 and row count match that revision reuses its stored data and gets no upload grant.",
        "operationId": "ArtifactsReserveArtifactPublicationHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReserveArtifactPublicationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReserveArtifactPublicationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Reserve a complete publication",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.reserve-publication",
          "description": "Reserves the entire table inventory in the selected Workspace and returns direct upload grants. Each table declares its name, input format, size, SHA-256 and row count; the worker derives its schema when it analyses the upload. Reusing a revision ID requires an identical declaration; a replacement names the expected active revision. A table whose name, input SHA-256 and row count match that revision reuses its stored data and gets no upload grant.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Reserve a complete publication",
          "visibility": "internal"
        }
      }
    },
    "/api/artifact-publications/receipt": {
      "post": {
        "description": "Returns the declared inventory and persisted processing results for an exact revision in the selected Workspace, including the schema analysis derived for each table, partial failures and reused tables. Does not read file bytes or run queries. A removed revision or deleted namespace is not found.",
        "operationId": "ArtifactsArtifactPublicationReceiptHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArtifactPublicationSelection"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactPublicationReceipt"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read publication progress",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.publication-receipt",
          "description": "Returns the declared inventory and persisted processing results for an exact revision in the selected Workspace, including the schema analysis derived for each table, partial failures and reused tables. Does not read file bytes or run queries. A removed revision or deleted namespace is not found.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read publication progress",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/artifacts": {
      "get": {
        "description": "Lists the files uploaded to this Workspace.",
        "operationId": "ArtifactsArtifactsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ArtifactInfo"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Artifacts",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.artifacts",
          "description": "Lists the files uploaded to this Workspace.",
          "doNotUseWhen": "Do not use this operation to inspect one Artifact or preview its rows.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Artifact view or upload permission.",
              "description": "The caller cannot view Workspace Artifacts."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Workspace Artifact list.",
          "title": "List Artifacts",
          "useWhen": "See every uploaded Artifact available in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/browse": {
      "get": {
        "description": "Lists the files and folders at one path in this Workspace, so you can pick something to look at or publish.",
        "operationId": "ArtifactsBrowseArtifactsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "path",
            "required": false,
            "schema": {
              "description": "Hierarchical path expressed as a dot-separated ltree (e.g., 'reports.q1.draft').",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BrowseArtifactsResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Browse uploaded files",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.browse-artifacts",
          "description": "Lists the files and folders at one path in this Workspace, so you can pick something to look at or publish.",
          "doNotUseWhen": "Do not use this operation to read one Artifact’s details or data rows.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Artifact view or upload permission.",
              "description": "The caller cannot view Workspace Artifacts."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Artifacts and virtual subfolders at the requested path.",
          "title": "Browse uploaded files",
          "useWhen": "Browse one Workspace folder to choose an Artifact or subfolder.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/folder": {
      "delete": {
        "description": "Deletes every uploaded file in a folder and below it. Anything still published has to be disconnected first.",
        "operationId": "ArtifactsDeleteArtifactFolderHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "path",
            "required": true,
            "schema": {
              "description": "Hierarchical path expressed as a dot-separated ltree (e.g., 'reports.q1.draft').",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DeleteArtifactFolderResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Delete a folder of Artifacts",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.delete-artifact-folder",
          "description": "Deletes every uploaded file in a folder and below it. Anything still published has to be disconnected first.",
          "doNotUseWhen": "Do not use this operation when any Artifact in the folder is still published.",
          "errors": [
            {
              "code": "WA-AF-016",
              "commonCorrection": "Unpublish every referenced Artifact before deleting the folder.",
              "description": "An Artifact in the folder is still referenced by a published Tap."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the number of deleted Artifacts.",
          "title": "Delete a folder of Artifacts",
          "useWhen": "Remove every uploaded Artifact in a folder that is no longer needed.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/publish-artifact": {
      "post": {
        "description": "Queues a reviewed CSV Artifact for publication. Captures its schema and immutable input, and makes the table available only after successful processing.",
        "operationId": "ArtifactsPublishArtifactHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublishArtifactInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactWorkStatus"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Publish an Artifact as a data source",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.publish-artifact",
          "description": "Queues a reviewed CSV Artifact for publication. Captures its schema and immutable input, and makes the table available only after successful processing.",
          "doNotUseWhen": "Do not use this operation before the file is ready and its schema is reviewed, or to edit an existing Tap.",
          "errors": [
            {
              "code": "WA-TCT-004",
              "commonCorrection": "Check the artifact identifier and Workspace context.",
              "description": "The Artifact was not found in this Workspace."
            },
            {
              "code": "WA-TCT-009",
              "commonCorrection": "Wait for file processing and review the schema first.",
              "description": "The Artifact is not ready to publish."
            },
            {
              "code": "WA-TCT-010",
              "commonCorrection": "Use the existing Tap or unpublish it before publishing again.",
              "description": "The Artifact is already published."
            },
            {
              "code": "WA-TCT-016",
              "commonCorrection": "Use a CSV Artifact.",
              "description": "This Artifact file type cannot yet be published."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns durable publication work status. The table becomes queryable after worker completion.",
          "title": "Publish an Artifact as a data source",
          "useWhen": "Make a ready Artifact available as a Workspace data source.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/run-artifact-schema-inference": {
      "post": {
        "description": "Uses the verified file sample to infer and save a data schema under the Workspace model policy.",
        "operationId": "ArtifactsRunArtifactSchemaInferenceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RunArtifactSchemaInferenceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactUploadResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Work out an Artifact's schema",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.run-artifact-schema-inference",
          "description": "Uses the verified file sample to infer and save a data schema under the Workspace model policy.",
          "doNotUseWhen": "Do not use this operation for a non-CSV Artifact or to manually replace its schema.",
          "errors": [
            {
              "code": "WA-AF-015",
              "commonCorrection": "Check the artifact identifier and Workspace context.",
              "description": "The Artifact was not found in this Workspace."
            },
            {
              "code": "WA-AF-003",
              "commonCorrection": "Upload or select a CSV Artifact.",
              "description": "Schema inference supports CSV Artifacts only."
            },
            {
              "code": "WA-AF-017",
              "commonCorrection": "Wait for the upload to finish, then retry.",
              "description": "The Artifact upload is not ready for schema inference."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the Artifact with its latest schema-inference outcome.",
          "title": "Work out an Artifact's schema",
          "useWhen": "Infer or retry the data schema for a ready CSV Artifact.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/unpublish-artifact": {
      "post": {
        "description": "Disconnects the Provider connection an uploaded file was powering, without deleting the file itself.",
        "operationId": "ArtifactsUnpublishArtifactHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnpublishArtifactInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/UnpublishArtifactResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Unpublish an Artifact",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.unpublish-artifact",
          "description": "Disconnects the Provider connection an uploaded file was powering, without deleting the file itself.",
          "doNotUseWhen": "Do not use this operation to delete the Artifact or its stored file.",
          "errors": [
            {
              "code": "WA-TCT-013",
              "commonCorrection": "Check whether it is already unpublished.",
              "description": "The Artifact has no active published Tap."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Removes the active Artifact-derived Tap and returns the result.",
          "title": "Unpublish an Artifact",
          "useWhen": "Stop using an Artifact as a Workspace data source while keeping the uploaded file.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/update-artifact-data-schema": {
      "post": {
        "description": "Replaces the saved shape of an uploaded file's data with one you supply.",
        "operationId": "ArtifactsUpdateArtifactDataSchemaHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateArtifactDataSchemaInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactInfo"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Replace an Artifact's schema",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.update-artifact-data-schema",
          "description": "Replaces the saved shape of an uploaded file's data with one you supply.",
          "doNotUseWhen": "Do not use this operation to infer a schema from the file or publish the Artifact.",
          "errors": [
            {
              "code": "WA-AF-015",
              "commonCorrection": "Check the artifact identifier and Workspace context.",
              "description": "The Artifact was not found in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the Artifact with the replacement data schema.",
          "title": "Replace an Artifact's schema",
          "useWhen": "Correct the saved data schema for an uploaded Artifact after reviewing its fields.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/uploads/actions/complete": {
      "post": {
        "description": "Queues verification and a bounded preview for an uploaded file. Returns durable work status; the file becomes ready only after the worker verifies its stored bytes.",
        "operationId": "ArtifactsCompleteArtifactUploadHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteArtifactUploadInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactWorkStatus"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Process an uploaded Artifact",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.complete-upload",
          "description": "Queues verification and a bounded preview for an uploaded file. Returns durable work status; the file becomes ready only after the worker verifies its stored bytes.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Process an uploaded Artifact",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/uploads/actions/prepare": {
      "post": {
        "description": "Reserves an upload in the selected Workspace and returns a short-lived, create-only direct upload URL. Repeating the same request ID returns the same reservation; file processing begins after completion is requested.",
        "operationId": "ArtifactsPrepareArtifactUploadHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PrepareArtifactUploadInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PrepareArtifactUploadResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Prepare an Artifact upload",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.prepare-upload",
          "description": "Reserves an upload in the selected Workspace and returns a short-lived, create-only direct upload URL. Repeating the same request ID returns the same reservation; file processing begins after completion is requested.",
          "errors": [
            {
              "code": "WA-AF-018",
              "commonCorrection": "Retry after the Workspace's storage setup completes.",
              "description": "The Workspace's data bucket is not configured for browser uploads yet, or upload URLs cannot be signed yet. No reservation was created."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Prepare an Artifact upload",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/{artifactId}": {
      "delete": {
        "description": "Hides an uploaded file and queues durable storage cleanup. Unpublish it first if it is currently queryable; cleanup waits for any outstanding upload URL to expire.",
        "operationId": "ArtifactsDeleteArtifactHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "artifactId parameter",
            "in": "path",
            "name": "artifactId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Delete an Artifact",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.delete-artifact",
          "description": "Hides an uploaded file and queues durable storage cleanup. Unpublish it first if it is currently queryable; cleanup waits for any outstanding upload URL to expire.",
          "doNotUseWhen": "Do not use this operation while the Artifact is still published as a data source.",
          "errors": [
            {
              "code": "WA-AF-015",
              "commonCorrection": "Check the artifact identifier and Workspace context.",
              "description": "The Artifact was not found in this Workspace."
            },
            {
              "code": "WA-AF-016",
              "commonCorrection": "Unpublish the Artifact before deleting it.",
              "description": "The Artifact is still referenced by a published Tap."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Hides the Artifact, queues storage cleanup, and returns true.",
          "title": "Delete an Artifact",
          "useWhen": "Permanently remove an uploaded Artifact that is no longer needed.",
          "visibility": "internal"
        }
      },
      "get": {
        "description": "Returns the details of one file uploaded to this Workspace.",
        "operationId": "ArtifactsArtifactHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "artifactId parameter",
            "in": "path",
            "name": "artifactId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactInfo"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read an Artifact",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.artifact",
          "description": "Returns the details of one file uploaded to this Workspace.",
          "doNotUseWhen": "Do not use this operation to preview the Artifact data or modify it.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Artifact view or upload permission.",
              "description": "The caller cannot view Workspace Artifacts."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Artifact when it belongs to this Workspace, otherwise null.",
          "title": "Read an Artifact",
          "useWhen": "Inspect the metadata and current state of one uploaded Artifact.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/{artifactId}/data-preview": {
      "get": {
        "description": "Returns the first few rows of an uploaded file so you can see what is in it before doing anything with it.",
        "operationId": "ArtifactsArtifactDataPreviewHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "artifactId parameter",
            "in": "path",
            "name": "artifactId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactDataPreview"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Preview an Artifact's rows",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.artifact-data-preview",
          "description": "Returns the first few rows of an uploaded file so you can see what is in it before doing anything with it.",
          "doNotUseWhen": "Do not use this operation to retrieve the full file or infer its schema.",
          "errors": [
            {
              "code": "WA-AF-015",
              "commonCorrection": "Check the artifact identifier and Workspace context.",
              "description": "The Artifact was not found in this Workspace."
            },
            {
              "code": "WA-AF-003",
              "commonCorrection": "Select a CSV Artifact.",
              "description": "Row preview supports CSV Artifacts only."
            },
            {
              "code": "WA-AF-017",
              "commonCorrection": "Wait for the upload to finish, then retry.",
              "description": "The Artifact upload is not ready for preview."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns a bounded preview of the Artifact rows.",
          "title": "Preview an Artifact's rows",
          "useWhen": "Inspect the first rows of a ready CSV Artifact before using it.",
          "visibility": "internal"
        }
      }
    },
    "/api/artifacts/{id}": {
      "patch": {
        "description": "Updates an uploaded file's name or where it sits.",
        "operationId": "ArtifactsUpdateArtifactHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateArtifactInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ArtifactInfo"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Rename or move an Artifact",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.artifacts.update-artifact",
          "description": "Updates an uploaded file's name or where it sits.",
          "doNotUseWhen": "Do not use this operation to change file contents or its data schema.",
          "errors": [
            {
              "code": "WA-AF-015",
              "commonCorrection": "Check the artifact identifier and Workspace context.",
              "description": "The Artifact was not found in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the Artifact with its updated name or path.",
          "title": "Rename or move an Artifact",
          "useWhen": "Change an uploaded Artifact name or folder path.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/api-tokens-enabled": {
      "put": {
        "description": "Allows or refuses personal access tokens in the selected Workspace. A token does not go through the Workspace's sign-in method, so turning tokens off refuses every token on its next query and stops members creating new ones; turning them back on lets unexpired, unrevoked tokens work again. Requires permission to manage the Workspace's sign-in.",
        "operationId": "AuthSetApiTokensEnabledHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetApiTokensEnabledInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantLoginPolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Turn personal access tokens on or off",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.set-api-tokens-enabled",
          "description": "Allows or refuses personal access tokens in the selected Workspace. A token does not go through the Workspace's sign-in method, so turning tokens off refuses every token on its next query and stops members creating new ones; turning them back on lets unexpired, unrevoked tokens work again. Requires permission to manage the Workspace's sign-in.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Turn personal access tokens on or off",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/breakglass-claim": {
      "post": {
        "description": "Exchange a breakglass token for a session.",
        "operationId": "AuthBreakglassClaimHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "token": {
                    "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
                    "type": "string"
                  }
                },
                "required": [
                  "token"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "breakglassClaim",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/breakglass-send": {
      "post": {
        "description": "Send breakglass recovery email (rate limited).",
        "operationId": "AuthBreakglassSendHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BreakglassSendInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "breakglassSend",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/complete-tenant-onboarding": {
      "post": {
        "operationId": "AuthCompleteTenantOnboardingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteTenantOnboardingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "completeTenantOnboarding",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/complete-user-onboarding": {
      "post": {
        "operationId": "AuthCompleteUserOnboardingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteUserOnboardingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "completeUserOnboarding",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/configure-scim": {
      "post": {
        "description": "Enable or re-provision SCIM for the tenant. Bearer token is returned once.",
        "operationId": "AuthConfigureScimHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConfigureScimResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "configureScim",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/consume-auth-token/{token}": {
      "post": {
        "description": "Consumes any single-use auth token issued by the platform (magic-link login,\nsignup confirm, or tenant invite) and mints a session. The server inspects\nthe token table the row lives in and dispatches the matching side-effect:\n- magic_link_codes  -\u003e verify + mint session for an existing user\n- pending_tenant_signups -\u003e atomically create Tenant + User + admin TenantUser\n- tenant_user_invite -\u003e claim invite + create TenantUser for invited tenant\nAuthPayload.redirectTo is set by the server to the correct post-auth\nlanding URL for the flow (new tenant subdomain on signup, invited tenant\non invite, first-tenant-or-picker on login).",
        "operationId": "AuthConsumeAuthTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "token parameter",
            "in": "path",
            "name": "token",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "consumeAuthToken",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/consume-desktop-auth-token-for-client/{token}": {
      "post": {
        "description": "Exchanges a Ponder or Pulse sign-in code for an independent session after verifying the bound client and S256 proof. Each code can succeed once.",
        "operationId": "AuthConsumeDesktopAuthTokenForClientHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "token parameter",
            "in": "path",
            "name": "token",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DesktopAuthTokenConsumeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Exchange a native sign-in code",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.exchange-native-code",
          "description": "Exchanges a Ponder or Pulse sign-in code for an independent session after verifying the bound client and S256 proof. Each code can succeed once.",
          "doNotUseWhen": "Do not use for session refresh.",
          "errors": [
            {
              "code": "WA-AU-005",
              "commonCorrection": "Restart sign-in when the original code and verifier cannot be recovered.",
              "description": "The code or proof is invalid, expired, or already used."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the signed-in person and a new independent session. A Pulse code can also return a device connect bundle.",
          "title": "Exchange a native sign-in code",
          "useWhen": "Use from Ponder or the Pulse daemon with the code returned by the browser and the original verifier.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/create-desktop-auth-token-for-client": {
      "post": {
        "description": "Creates a five-minute, single-use sign-in code for Ponder or Pulse, bound to the app that asked by its S256 proof challenge. Requires your own browser session; an impersonated session or an API token cannot create one. A Pulse code also carries device enrollment when you are an active member of this Workspace and it has one Pulse connector with its activity stream on.",
        "operationId": "AuthCreateDesktopAuthTokenForClientHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DesktopAuthTokenCreateInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DesktopAuthTokenPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Create a native sign-in code",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.create-native-code",
          "description": "Creates a five-minute, single-use sign-in code for Ponder or Pulse, bound to the app that asked by its S256 proof challenge. Requires your own browser session; an impersonated session or an API token cannot create one. A Pulse code also carries device enrollment when you are an active member of this Workspace and it has one Pulse connector with its activity stream on.",
          "doNotUseWhen": "Do not use to exchange an API token or an impersonated session for a session.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Restart sign-in with a fresh verifier and its S256 challenge.",
              "description": "The client or S256 challenge is invalid."
            },
            {
              "code": "WA-AU-004",
              "commonCorrection": "End impersonation and sign in as yourself.",
              "description": "The browser session is impersonated."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns an opaque code, its expiry, and whether the exchange enrolls this device; no session credential is returned.",
          "title": "Create a native sign-in code",
          "useWhen": "Use after confirming sign-in to Ponder or Pulse in the browser.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/create-workspace": {
      "post": {
        "description": "Creates a new Workspace. While signup is invite-only, a person who is not Parable staff must supply an unused invite code, which this call redeems.",
        "operationId": "AuthCreateWorkspaceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateWorkspaceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Create a Workspace",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.create-workspace",
          "description": "Creates a new Workspace. While signup is invite-only, a person who is not Parable staff must supply an unused invite code, which this call redeems.",
          "doNotUseWhen": "Do not use when you only need to check whether a Workspace address is available.",
          "errors": [
            {
              "code": "WA-AU-027",
              "commonCorrection": "Choose a different available Workspace address.",
              "description": "The requested Workspace address is already in use."
            },
            {
              "code": "WA-AU-005",
              "commonCorrection": "Refresh the sign-in flow and try again.",
              "description": "The current account cannot complete this Workspace-creation flow."
            },
            {
              "code": "WA-AU-032",
              "commonCorrection": "Ask the person who invited you for a new code.",
              "description": "The invite code is unknown, expired, revoked, or already redeemed."
            },
            {
              "code": "WA-AU-033",
              "commonCorrection": "Enter the invite code you were sent.",
              "description": "Signup is invite-only and no invite code was supplied."
            },
            {
              "code": "WA-AU-034",
              "commonCorrection": "Wait an hour, then try again.",
              "description": "Too many invalid invite codes were entered in the last hour."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Creates the Workspace and returns the resulting authenticated context.",
          "title": "Create a Workspace",
          "useWhen": "Use when the signed-in account needs a new Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/invites": {
      "get": {
        "description": "Returns how many invite codes you can still send and the codes you sent, newest first, each with its status. Parable staff are unlimited.",
        "operationId": "AuthMyInvitesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MyInvitesView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List your invite codes",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.invite-codes.mine.list",
          "description": "Returns how many invite codes you can still send and the codes you sent, newest first, each with its status. Parable staff are unlimited.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List your invite codes",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Creates a single-use invite code and emails it to one address with a link to sign up. Uses one of your invites; Parable staff are unlimited. Returns the full code once so it can be shared if the email fails.",
        "operationId": "AuthSendInviteCodeHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendInviteCodeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SentInviteCode"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Send an invite code",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.invite-codes.mine.send",
          "description": "Creates a single-use invite code and emails it to one address with a link to sign up. Uses one of your invites; Parable staff are unlimited. Returns the full code once so it can be shared if the email fails.",
          "errors": [
            {
              "code": "WA-AU-035",
              "commonCorrection": "Wait for an unused code to expire, or ask Parable for more invites.",
              "description": "Every invite you were granted is in use."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Send an invite code",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/join-tenant": {
      "post": {
        "operationId": "AuthJoinTenantHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JoinTenantInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "joinTenant",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/login-methods": {
      "put": {
        "description": "Replaces the sign-in methods this Workspace allows. The identity provider remains the source of truth.",
        "operationId": "AuthSetLoginMethodsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetLoginMethodsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantLoginPolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Choose how people sign in",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.set-login-methods",
          "description": "Replaces the sign-in methods this Workspace allows. The identity provider remains the source of truth.",
          "doNotUseWhen": "Do not use when you only need to read the current sign-in policy.",
          "errors": [
            {
              "code": "WA-AU-021",
              "commonCorrection": "Run and complete a successful SSO connection test first.",
              "description": "SSO cannot be activated until its connection test succeeds."
            },
            {
              "code": "WA-AU-030",
              "commonCorrection": "Set a tenant-scoped default role before activating the method.",
              "description": "SSO or SCIM activation needs a default provisioning role."
            },
            {
              "code": "WA-AU-022",
              "commonCorrection": "Run a new SSO connection test and activate it promptly.",
              "description": "The last successful SSO test is too old to activate."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the updated login policy.",
          "title": "Choose how people sign in",
          "useWhen": "Use when an authorized administrator needs to replace the selected Workspace’s allowed sign-in methods.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/login-policy": {
      "get": {
        "description": "Returns the sign-in methods this Workspace allows, including its SSO and SCIM settings. Credentials are never included.",
        "operationId": "AuthLoginPolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantLoginPolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read how people sign in",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.login-policy",
          "description": "Returns the sign-in methods this Workspace allows, including its SSO and SCIM settings. Credentials are never included.",
          "doNotUseWhen": "Do not use when you need to change sign-in methods or connection settings.",
          "errors": [
            {
              "code": "WA-AU-020",
              "commonCorrection": "Select a valid Workspace before reading its login policy.",
              "description": "The request has no valid Workspace context."
            },
            {
              "code": "WA-AU-018",
              "commonCorrection": "Configure the Workspace’s sign-in policy before reading it.",
              "description": "This Workspace has no login policy yet."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the selected Workspace’s cached login policy without credentials.",
          "title": "Read how people sign in",
          "useWhen": "Use when you need the selected Workspace’s current sign-in policy and SSO or SCIM status.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/logout": {
      "post": {
        "description": "Signs you out of the session you are currently using.",
        "operationId": "AuthLogoutHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthSuccess"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Sign out",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.logout",
          "description": "Signs you out of the session you are currently using.",
          "doNotUseWhen": "Do not use when you need to keep this session and end other sessions.",
          "errors": [
            {
              "code": "WA-AU-004",
              "commonCorrection": "Sign in again before signing out.",
              "description": "No valid signed-in session was provided."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Ends the current signed-in session.",
          "title": "Sign out",
          "useWhen": "Use when the current signed-in session should end.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/logout-all": {
      "post": {
        "description": "Ends every one of your other active sessions and leaves only the one you are using now. Useful if you think a device has been lost or compromised.",
        "operationId": "AuthLogoutAllHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LogoutAllResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Sign out everywhere else",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.logout-all",
          "description": "Ends every one of your other active sessions and leaves only the one you are using now. Useful if you think a device has been lost or compromised.",
          "doNotUseWhen": "Do not use when you need to end only the current session or one known session.",
          "errors": [
            {
              "code": "WA-AU-004",
              "commonCorrection": "Sign in again before ending other sessions.",
              "description": "No valid signed-in session was provided."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Ends every active session except the current one.",
          "title": "Sign out everywhere else",
          "useWhen": "Use when other sessions for the signed-in account may be unsafe and should end.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/lookup-tenants": {
      "post": {
        "description": "Apex anti-enumeration: resolve candidate tenants for an email prior to SSO.",
        "operationId": "AuthLookupTenantsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LookupTenantsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LookupTenantsResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "lookupTenants",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/lookup-tenants-by-email": {
      "get": {
        "description": "Lookup the tenants a user belongs to by email. Used by the login surface\non `app.parable.work` to route a returning user to their tenant\nsubdomain. Returns an empty list when the email is unknown -- callers\nmust render the same \"check your email\" copy for the 0 and 1+ cases so\nthat the response is not an account-existence oracle. Public (pre-auth).",
        "operationId": "AuthLookupTenantsByEmailHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "email",
            "required": true,
            "schema": {
              "description": "An email address",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantPublic"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "lookupTenantsByEmail",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/mark-welcome-seen": {
      "post": {
        "description": "Stamp User.welcomeSeenAt for the current user the first time they land in\nthe app (on the /welcome intro). Set-once and idempotent: a no-op if\nalready set, so re-visiting /welcome never resets it. Drives the one-time\nwelcome animation.",
        "operationId": "AuthMarkWelcomeSeenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "markWelcomeSeen",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/me": {
      "get": {
        "description": "Returns the signed-in account, its staff roles, and its Workspace memberships. Access can come from both staff roles and Workspace roles; a synthetic Workspace entry alone does not describe all available actions. Each operation also checks access to its target.",
        "operationId": "AuthMeHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/UserWithPermissions"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read who you are signed in as",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.me",
          "description": "Returns the signed-in account, its staff roles, and its Workspace memberships. Access can come from both staff roles and Workspace roles; a synthetic Workspace entry alone does not describe all available actions. Each operation also checks access to its target.",
          "doNotUseWhen": "Do not use when you need the membership record for one selected Workspace.",
          "errors": [
            {
              "code": "WA-AU-004",
              "commonCorrection": "Sign in again with an active account.",
              "description": "The signed-in account no longer exists or the session is invalid."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the authenticated account, staff roles, and Workspace memberships.",
          "title": "Read who you are signed in as",
          "useWhen": "Use when you need the signed-in account and the Workspaces it can access.",
          "visibility": "internal"
        }
      },
      "patch": {
        "description": "Updates your own account details.",
        "operationId": "AuthUpdateUserHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/UserBase"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Update your own account",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.update-user",
          "description": "Updates your own account details.",
          "doNotUseWhen": "Do not use when you need to change another person’s Workspace membership or roles.",
          "errors": [
            {
              "code": "WA-AU-001",
              "commonCorrection": "Provide a non-empty name or omit that field.",
              "description": "The requested name change clears the required account name."
            },
            {
              "code": "WA-AU-002",
              "commonCorrection": "Provide at least one account field to update.",
              "description": "The request contains no changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the updated account details.",
          "title": "Update your own account",
          "useWhen": "Use when you need to change details on the signed-in account.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/oauth-login": {
      "post": {
        "description": "Authenticates a user via OAuth provider ID token.\nVerifies the token, looks up the user by email, and creates a session.\nReturns an error if the email is not associated with an existing user.",
        "operationId": "AuthOauthLoginHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OAuthLoginInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "oauthLogin",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/oauth-signup-start": {
      "post": {
        "description": "Begins a self-serve OAuth signup. Validates the Google id_token + nonce,\nthen mints a session for either an existing user or a net-new identity.\nNet-new identities receive a tenant-less session and complete onboarding\nvia completeUserOnboarding + createWorkspace + completeTenantOnboarding.\nOn Google-side failures (bad id_token, nonce mismatch, email_verified\nfalse), returns the same INVALID_TOKEN error as oauthLogin to avoid an\noracle distinguishing login from signup. Disposable email blocklist\nand per-email rate limit only apply to the net-new branch (existing\nusers must not be blocked from logging in).",
        "operationId": "AuthOauthSignupStartHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OAuthSignupStartInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "oauthSignupStart",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/oidc-connection": {
      "get": {
        "description": "Reads this Workspace's OIDC connection back from the identity provider. Returns nothing if no SSO connection is set up.",
        "operationId": "AuthOidcConnectionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OidcConnectionReadback"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the OIDC single sign-on connection",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.oidc-connection",
          "description": "Reads this Workspace's OIDC connection back from the identity provider. Returns nothing if no SSO connection is set up.",
          "doNotUseWhen": "Do not use when you need to create or update an OIDC connection.",
          "errors": [
            {
              "code": "WA-AU-020",
              "commonCorrection": "Select a valid Workspace before reading its OIDC connection.",
              "description": "The request has no valid Workspace context."
            },
            {
              "code": "WA-AU-026",
              "commonCorrection": "Wait and retry the read later.",
              "description": "The identity provider is temporarily unavailable."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the OIDC readback or no result when OIDC is not configured.",
          "title": "Read the OIDC single sign-on connection",
          "useWhen": "Use when you need to inspect the selected Workspace’s OIDC connection settings.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/pulse-device-enrollment": {
      "get": {
        "description": "Tells you if a Pulse sign-in from this browser session also enrolls the Mac in this Workspace, and if not, why not. Any active member of a Workspace with a Pulse connector and its activity stream on can enroll a Mac. Nothing is created.",
        "operationId": "AuthPulseDeviceEnrollmentHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PulseDeviceEnrollment"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check if Pulse enrolls this Mac",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.client-registration.enrollment-check",
          "description": "Tells you if a Pulse sign-in from this browser session also enrolls the Mac in this Workspace, and if not, why not. Any active member of a Workspace with a Pulse connector and its activity stream on can enroll a Mac. Nothing is created.",
          "doNotUseWhen": "Do not use to enroll a Mac or to create an enrollment secret.",
          "errors": [
            {
              "code": "WA-AU-004",
              "commonCorrection": "Sign in again before you connect Pulse.",
              "description": "No valid signed-in session was provided."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the outcome that a Pulse code minted now would have.",
          "title": "Check if Pulse enrolls this Mac",
          "useWhen": "Use on the Pulse connect page before the person confirms the sign-in.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/refresh-session": {
      "post": {
        "description": "Refreshes the current session and issues a new token",
        "operationId": "AuthRefreshSessionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RefreshPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "refreshSession",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/rotate-scim-token": {
      "post": {
        "description": "Rotate the SCIM bearer token. New token is returned once.",
        "operationId": "AuthRotateScimTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RotateScimTokenResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "rotateScimToken",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/saml-connection": {
      "get": {
        "description": "Reads this Workspace's SAML connection back from the identity provider. The certificate is never returned.",
        "operationId": "AuthSamlConnectionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SamlConnectionReadback"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the SAML single sign-on connection",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.saml-connection",
          "description": "Reads this Workspace's SAML connection back from the identity provider. The certificate is never returned.",
          "doNotUseWhen": "Do not use when you need to create or update a SAML connection.",
          "errors": [
            {
              "code": "WA-AU-020",
              "commonCorrection": "Select a valid Workspace before reading its SAML connection.",
              "description": "The request has no valid Workspace context."
            },
            {
              "code": "WA-AU-026",
              "commonCorrection": "Wait and retry the read later.",
              "description": "The identity provider is temporarily unavailable."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the SAML readback or no result when SAML is not configured.",
          "title": "Read the SAML single sign-on connection",
          "useWhen": "Use when you need to inspect the selected Workspace’s SAML connection settings.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/save-oidc-connection": {
      "post": {
        "description": "Create or update the tenant's OIDC connection in Stytch from admin-supplied\nissuer/client_id/client_secret, then persist the connection id on the cached\nlogin policy. The client secret is write-only and never echoed back.",
        "operationId": "AuthSaveOidcConnectionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveOidcConnectionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SaveOidcConnectionResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "saveOidcConnection",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/save-saml-connection": {
      "post": {
        "description": "Creates or updates this Workspace's SAML connection. The certificate can be written but is never read back.",
        "operationId": "AuthSaveSamlConnectionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveSamlConnectionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SaveSamlConnectionResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set up SAML single sign-on",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.save-saml-connection",
          "description": "Creates or updates this Workspace's SAML connection. The certificate can be written but is never read back.",
          "doNotUseWhen": "Do not use when you need to read the existing SAML connection or activate SAML sign-in.",
          "errors": [
            {
              "code": "WA-AU-020",
              "commonCorrection": "Select a valid Workspace before saving SAML.",
              "description": "The request has no valid Workspace context."
            },
            {
              "code": "WA-AU-026",
              "commonCorrection": "Wait and retry the save later.",
              "description": "The identity provider is temporarily unavailable."
            },
            {
              "code": "HTTP 400",
              "commonCorrection": "Resolve the conflicting sign-in method and provide the required SAML configuration.",
              "description": "The SAML input cannot be applied, such as attempting to replace active OIDC or omitting a new certificate."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Saves the SAML connection and returns safe connection readback and policy data.",
          "title": "Set up SAML single sign-on",
          "useWhen": "Use when an authorized administrator needs to create or update the selected Workspace’s SAML connection.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/scim-default-role": {
      "put": {
        "description": "Chooses the role given to people who arrive through SSO or SCIM with no role of their own and to people an agent invites, or clears it so they arrive with nothing.",
        "operationId": "AuthSetScimDefaultRoleHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetScimDefaultRoleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantLoginPolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set the role new people get automatically",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.set-scim-default-role",
          "description": "Chooses the role given to people who arrive through SSO or SCIM with no role of their own and to people an agent invites, or clears it so they arrive with nothing.",
          "doNotUseWhen": "Do not use when you need to edit an existing person’s roles.",
          "errors": [
            {
              "code": "WA-AU-031",
              "commonCorrection": "Choose an existing tenant-scoped role.",
              "description": "The requested role is missing or is not tenant-scoped."
            },
            {
              "code": "WA-AU-030",
              "commonCorrection": "Set another tenant-scoped default role before clearing this one.",
              "description": "The default role cannot be cleared while SSO or SCIM needs one."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the updated login policy with the selected default role.",
          "title": "Set the role new people get automatically",
          "useWhen": "Use when an authorized administrator needs to set or clear the default role for SSO or SCIM-provisioned people.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/send-magic-link": {
      "post": {
        "description": "Sends a magic link for login to the supplied email, if that email exists in our platform",
        "operationId": "AuthSendMagicLinkHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendMagicLinkInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "sendMagicLink",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/sessions": {
      "get": {
        "description": "Lists every session you currently have open, and where each one is.",
        "operationId": "AuthSessionsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/Session"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List your active sessions",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.sessions",
          "description": "Lists every session you currently have open, and where each one is.",
          "doNotUseWhen": "Do not use when you need to end sessions; use a sign-out operation instead.",
          "errors": [
            {
              "code": "WA-AU-004",
              "commonCorrection": "Sign in again before listing sessions.",
              "description": "No valid signed-in session was provided."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the account’s active sessions with the current session identified.",
          "title": "List your active sessions",
          "useWhen": "Use when you need to review the active sessions for the signed-in account.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/sessions/{sessionId}": {
      "delete": {
        "description": "Ends one specific session, so whoever is using it has to sign in again.",
        "operationId": "AuthRevokeSessionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "sessionId parameter",
            "in": "path",
            "name": "sessionId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthSuccess"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Sign out one session",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.revoke-session",
          "description": "Ends one specific session, so whoever is using it has to sign in again.",
          "doNotUseWhen": "Do not use when you need to end every other session.",
          "errors": [
            {
              "code": "WA-AU-004",
              "commonCorrection": "Sign in again before ending a session.",
              "description": "No valid signed-in session was provided."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Ends the specified session.",
          "title": "Sign out one session",
          "useWhen": "Use when one known active session for the signed-in account must end.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/set-user-avatar": {
      "post": {
        "description": "Replace the CURRENT user's profile picture with an uploaded image. Multipart\nupload (image/* up to 2MB, per the Asset.Image scalar); the image is stored in\nGCS and its full Asset.Image metadata (assetId, url, dimensions, ...) is written\nto User.avatar, replacing any provider-supplied one. Returns the new CDN URL so\nthe client can update its preview.",
        "operationId": "AuthSetUserAvatarHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "avatar": {
                    "description": "image file upload, max size: 104857600 bytes",
                    "format": "binary",
                    "type": "string"
                  },
                  "data": {
                    "description": "JSON string containing the SetUserAvatarInput fields (excluding file fields)",
                    "format": "json",
                    "type": "string"
                  }
                },
                "required": [
                  "data",
                  "avatar"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SetUserAvatarResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "setUserAvatar",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/signup-tenant": {
      "post": {
        "description": "Starts self-serve signup. Validates the company name slugifies to something\nvalid, persists a PendingTenantSignup row, and sends a magic confirm link.\nReturns true on every accepted request (silent success) to avoid enumeration.\nLegacy: no page calls it. While SIGNUP_REQUIRES_INVITE_CODE is on it\nrefuses with WA-AU-033, because it has no invite code to redeem.",
        "operationId": "AuthSignupTenantHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SignupTenantInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "signupTenant",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/sso-callback": {
      "post": {
        "description": "Complete OIDC/SAML SSO exchange and establish a session.",
        "operationId": "AuthSsoCallbackHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SsoCallbackInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "ssoCallback",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/sso-start": {
      "post": {
        "description": "Start OIDC/SAML SSO for a tenant (redirect URL in result).\nRate limited per source IP: this @public endpoint is the funnel every\nunauthenticated tenant visitor passes through, and its 302 target (Stytch\nauthorize URL vs apex /login) is an oracle for whether a tenant has SSO\nactive. The limit caps cross-slug enumeration while staying generous enough\nfor bursty corporate logins behind a shared egress IP.",
        "operationId": "AuthSsoStartHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SsoStartInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SsoStartResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "ssoStart",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/start-login-email": {
      "post": {
        "operationId": "AuthStartLoginEmailHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartLoginEmailInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "startLoginEmail",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/start-signup-email": {
      "post": {
        "operationId": "AuthStartSignupEmailHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartSignupEmailInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "startSignupEmail",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/test-connection-complete": {
      "post": {
        "description": "Complete SSO test-connection handshake and refresh cached policy. On\nsuccess, lastTestSucceededAt is bumped to now (5-minute freshness gate\nfor setLoginMethods activation).",
        "operationId": "AuthTestConnectionCompleteHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestConnectionCompleteInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantLoginPolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "testConnectionComplete",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/test-connection-start": {
      "post": {
        "description": "Starts a five-minute test of an SSO connection. It is deliberately kept separate from real sign-in, so a test can never let anyone in.",
        "operationId": "AuthTestConnectionStartHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestConnectionStartInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TestConnectionStartResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Test single sign-on before turning it on",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.test-connection-start",
          "description": "Starts a five-minute test of an SSO connection. It is deliberately kept separate from real sign-in, so a test can never let anyone in.",
          "doNotUseWhen": "Do not use when you need to activate sign-in methods or complete the test callback.",
          "errors": [
            {
              "code": "WA-AU-018",
              "commonCorrection": "Save an OIDC or SAML connection before starting a test.",
              "description": "This Workspace has no SSO connection to test."
            },
            {
              "code": "WA-AU-020",
              "commonCorrection": "Select a valid Workspace before starting the test.",
              "description": "The request has no valid Workspace context."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the authorization URL and isolated state for a five-minute SSO test.",
          "title": "Test single sign-on before turning it on",
          "useWhen": "Use when an authorized administrator needs the short-lived test handoff for an existing SSO connection.",
          "visibility": "internal"
        }
      }
    },
    "/api/auth/verify-email-code": {
      "post": {
        "operationId": "AuthVerifyEmailCodeHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyEmailCodeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuthPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "verifyEmailCode",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/verify-token": {
      "get": {
        "description": "Verify if a token is still valid",
        "operationId": "AuthVerifyTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "token",
            "required": true,
            "schema": {
              "description": "JSON Web Token string",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "verifyToken",
        "tags": [
          "auth"
        ]
      }
    },
    "/api/auth/workspace-slug-available/{slug}": {
      "get": {
        "description": "Says whether a Workspace address is still available to use.",
        "operationId": "AuthWorkspaceSlugAvailableHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "slug parameter",
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "description": "A URL friendly version of a string",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Check whether a Workspace address is free",
        "tags": [
          "auth"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.authentication.workspace-slug-available",
          "description": "Says whether a Workspace address is still available to use.",
          "doNotUseWhen": "Do not use when you need to create the Workspace.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Provide a valid Workspace address.",
              "description": "The proposed Workspace address is not valid."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns whether the normalized Workspace address is available.",
          "title": "Check whether a Workspace address is free",
          "useWhen": "Use when you need to check whether a proposed Workspace address can be used.",
          "visibility": "internal"
        }
      }
    },
    "/api/catalog/table-maintenance-runs": {
      "get": {
        "description": "Returns the log of background maintenance run against this Workspace's tables. Admin only, because it exposes internal housekeeping.",
        "operationId": "CatalogTableMaintenanceRunsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantTableMaintenanceRunsResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List table maintenance runs",
        "tags": [
          "catalog"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.catalog.table-maintenance-runs",
          "description": "Returns the log of background maintenance run against this Workspace's tables. Admin only, because it exposes internal housekeeping.",
          "doNotUseWhen": "Do not use this operation to inspect table data or quality results.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Workspace maintenance-run log.",
          "title": "List table maintenance runs",
          "useWhen": "Review completed background maintenance runs for Workspace tables.",
          "visibility": "internal"
        }
      }
    },
    "/api/catalog/table-quality-results": {
      "get": {
        "description": "Returns the most recent data-quality check for every table in this Workspace's catalog.",
        "operationId": "CatalogTableQualityResultsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantTableQualityResultsResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the latest data-quality results",
        "tags": [
          "catalog"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.catalog.table-quality-results",
          "description": "Returns the most recent data-quality check for every table in this Workspace's catalog.",
          "doNotUseWhen": "Do not use this operation to inspect drift or maintenance results.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the latest data-quality result for each Workspace table.",
          "title": "Read the latest data-quality results",
          "useWhen": "Review the latest data-quality results for Workspace tables.",
          "visibility": "internal"
        }
      }
    },
    "/api/catalog/table-shape-stats": {
      "get": {
        "description": "Returns the most recent snapshot of each table's columns and their distributions, for every table in this Workspace's catalog.",
        "operationId": "CatalogTableShapeStatsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantTableShapeStatsResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the shape of every table",
        "tags": [
          "catalog"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.catalog.table-shape-stats",
          "description": "Returns the most recent snapshot of each table's columns and their distributions, for every table in this Workspace's catalog.",
          "doNotUseWhen": "Do not use this operation to read data-quality or maintenance results.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the latest table shape statistics for the Workspace.",
          "title": "Read the shape of every table",
          "useWhen": "Inspect the latest column shapes and distributions across this Workspace catalog.",
          "visibility": "internal"
        }
      }
    },
    "/api/catalog/table-spc-results": {
      "get": {
        "description": "Returns the most recent statistical process-control result for every table in this Workspace's catalog, which is how unexpected drift gets noticed.",
        "operationId": "CatalogTableSpcResultsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantTableSpcResultsResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the latest drift checks",
        "tags": [
          "catalog"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.catalog.table-spc-results",
          "description": "Returns the most recent statistical process-control result for every table in this Workspace's catalog, which is how unexpected drift gets noticed.",
          "doNotUseWhen": "Do not use this operation to inspect table shapes or data-quality checks.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the latest drift-check result for each Workspace table.",
          "title": "Read the latest drift checks",
          "useWhen": "Review the latest statistical drift results for Workspace tables.",
          "visibility": "internal"
        }
      }
    },
    "/api/connector-requests/connector-requests": {
      "get": {
        "description": "Lists the requests this Workspace has made for Providers to be supported.",
        "operationId": "ConnectorRequestsConnectorRequestsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ConnectorRequestStatusEnum"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "type": "number"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "format": "double",
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConnectorRequestsPaginatedResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Provider requests",
        "tags": [
          "connector-requests"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.requests.connector-requests",
          "description": "Lists the requests this Workspace has made for Providers to be supported.",
          "doNotUseWhen": "Do not use this operation to create a request or inspect one request in detail.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with connector view permission.",
              "description": "The caller cannot view Workspace Provider requests."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns a paginated list of matching Provider requests.",
          "title": "List Provider requests",
          "useWhen": "Review Provider support requests made by this Workspace.",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Asks for a Provider that Parable does not support yet to be added.",
        "operationId": "ConnectorRequestsCreateConnectorRequestHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateConnectorRequestInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConnectorRequestSummary"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Ask for a new Provider",
        "tags": [
          "connector-requests"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.requests.create-connector-request",
          "description": "Asks for a Provider that Parable does not support yet to be added.",
          "doNotUseWhen": "Do not use this operation to connect an already supported Provider.",
          "errors": [
            {
              "code": "WA-RS-002",
              "commonCorrection": "Review the existing request instead of creating a duplicate.",
              "description": "An equivalent Provider request already exists."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Creates and returns the pending Provider request.",
          "title": "Ask for a new Provider",
          "useWhen": "Request support for a Provider that is not yet available in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/connector-requests/{id}": {
      "get": {
        "description": "Returns one request asking for a Provider to be supported.",
        "operationId": "ConnectorRequestsConnectorRequestHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConnectorRequestSummary"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Provider request",
        "tags": [
          "connector-requests"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.requests.connector-request",
          "description": "Returns one request asking for a Provider to be supported.",
          "doNotUseWhen": "Do not use this operation to create or list Provider requests.",
          "errors": [
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the request identifier.",
              "description": "The Provider request was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the selected Provider request.",
          "title": "Read a Provider request",
          "useWhen": "Inspect the status and details of one Provider support request.",
          "visibility": "internal"
        }
      }
    },
    "/api/connectors": {
      "post": {
        "description": "Adds a Provider connection to this Workspace and applies the settings it needs to start working.",
        "operationId": "ConnectorsAddConnectorToTenantHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddConnectorToTenantInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AddConnectorToTenantPayload"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Connect a Provider",
        "tags": [
          "connectors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.connections.add-connector-to-tenant",
          "description": "Adds a Provider connection to this Workspace and applies the settings it needs to start working.",
          "doNotUseWhen": "Do not use this operation to update or remove an existing Provider connection.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            },
            {
              "code": "WA-CN-002",
              "commonCorrection": "Choose an available Provider authentication strategy.",
              "description": "The selected authentication strategy was not found for this Provider."
            },
            {
              "code": "WA-CN-005",
              "commonCorrection": "Choose a released Provider or ask an administrator to promote it.",
              "description": "The Provider is not released for Workspace enablement."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Creates and returns the Provider connection and setup result.",
          "title": "Connect a Provider",
          "useWhen": "Add a supported Provider connection to this Workspace with its initial configuration.",
          "visibility": "internal"
        }
      }
    },
    "/api/connectors/categories": {
      "get": {
        "description": "Returns the global Provider categories in display order. Requires a signed-in account.",
        "operationId": "ConnectorsConnectorCategoriesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ConnectorCategory"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Connector categories",
        "tags": [
          "connectors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.connections.connector-categories",
          "description": "Returns the global Provider categories in display order. Requires a signed-in account.",
          "doNotUseWhen": "Do not use this operation to list Workspace Provider connections or Taps.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in before reading the Provider categories.",
              "description": "The caller is not signed in."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns Connector categories in display order.",
          "title": "List Connector categories",
          "useWhen": "Read the display categories used to organize available Providers.",
          "visibility": "internal"
        }
      }
    },
    "/api/connectors/configure": {
      "post": {
        "description": "POST /api/connectors/configure\nConfigure an existing connector instance providing the required account setup",
        "operationId": "ConnectorsConfigureConnectorHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfigureConnectorInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConfigureConnectorResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "configureConnector",
        "tags": [
          "connectors"
        ]
      }
    },
    "/api/connectors/connector-oauth-complete": {
      "post": {
        "operationId": "ConnectorsConnectorOAuthCompleteHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConnectorOAuthCompleteInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConnectorOAuthCompleteResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "connectorOAuthComplete",
        "tags": [
          "connectors"
        ]
      }
    },
    "/api/connectors/connector-oauth-start": {
      "post": {
        "operationId": "ConnectorsConnectorOAuthStartHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConnectorOAuthStartInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConnectorOAuthStartResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "connectorOAuthStart",
        "tags": [
          "connectors"
        ]
      }
    },
    "/api/connectors/tenant-connector-taps": {
      "get": {
        "description": "Lists the Taps offered by all the Connectors installed in this Workspace. A Tap is one stream of data a Connector can pull.",
        "operationId": "ConnectorsTenantConnectorTapsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ConnectorTap"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List every Tap this Workspace could use",
        "tags": [
          "connectors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.connections.tenant-connector-taps",
          "description": "Lists the Taps offered by all the Connectors installed in this Workspace. A Tap is one stream of data a Connector can pull.",
          "doNotUseWhen": "Do not use this operation to list only the Taps already configured for ingestion.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns available Tap definitions, deduplicated by Provider and Tap.",
          "title": "List every Tap this Workspace could use",
          "useWhen": "Discover data streams offered by Providers installed in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/connectors/validate": {
      "post": {
        "description": "Checks stored credentials against the Provider itself and records whether they still work.",
        "operationId": "ConnectorsValidateCredentialsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ValidateCredentialsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ValidateCredentialsResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Test a Provider's credentials",
        "tags": [
          "connectors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.connections.validate-credentials",
          "description": "Checks stored credentials against the Provider itself and records whether they still work.",
          "doNotUseWhen": "Do not use this operation to change credentials or start an OAuth flow.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with connector view permission.",
              "description": "The caller cannot validate this Workspace connection."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the credential validation result and records its current status.",
          "title": "Test a Provider's credentials",
          "useWhen": "Check whether stored credentials for a Provider connection still work.",
          "visibility": "internal"
        }
      }
    },
    "/api/connectors/{tenantConnectorId}": {
      "delete": {
        "description": "Removes a Provider connection from this Workspace, so it stops bringing data in.",
        "operationId": "ConnectorsRemoveConnectorHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "tenantConnectorId parameter",
            "in": "path",
            "name": "tenantConnectorId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Remove a Provider connection",
        "tags": [
          "connectors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.connections.remove-connector",
          "description": "Removes a Provider connection from this Workspace, so it stops bringing data in.",
          "doNotUseWhen": "Do not use this operation to temporarily disable a Tap or change connection credentials.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            },
            {
              "code": "WA-CN-001",
              "commonCorrection": "Check the connection identifier.",
              "description": "The Provider connection was not found."
            },
            {
              "code": "WA-CN-004",
              "commonCorrection": "Use a connection from the current Workspace.",
              "description": "The Provider connection belongs to a different Workspace."
            },
            {
              "code": "WA-CN-003",
              "commonCorrection": "No further removal is needed.",
              "description": "The Provider connection was already removed."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Removes the Provider connection and returns true.",
          "title": "Remove a Provider connection",
          "useWhen": "Remove a Provider connection that this Workspace no longer needs.",
          "visibility": "internal"
        }
      }
    },
    "/api/connectors/{tenantConnectorId}/config-history": {
      "get": {
        "description": "Returns every settings change made to one Provider connection in this Workspace.",
        "operationId": "ConnectorsConnectorConfigurationHistoryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "tenantConnectorId parameter",
            "in": "path",
            "name": "tenantConnectorId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantConnectorConfigurationHistory"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List a Connector's setting history",
        "tags": [
          "connectors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.connections.connector-configuration-history",
          "description": "Returns every settings change made to one Provider connection in this Workspace.",
          "doNotUseWhen": "Do not use this operation to change the connection or validate its credentials.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            },
            {
              "code": "WA-CN-001",
              "commonCorrection": "Check the connection identifier.",
              "description": "The Provider connection was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the connection configuration history.",
          "title": "List a Connector's setting history",
          "useWhen": "Review the configuration changes made to one Workspace Provider connection.",
          "visibility": "internal"
        }
      }
    },
    "/api/devices": {
      "get": {
        "description": "Lists the Pulse clients enrolled in this Workspace, including ones already revoked. Can be narrowed to a single Provider connection.",
        "operationId": "DevicesDevicesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "tenantConnectorId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/DeviceInfo"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Pulse clients",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.client-registration.devices",
          "description": "Lists the Pulse clients enrolled in this Workspace, including ones already revoked. Can be narrowed to a single Provider connection.",
          "doNotUseWhen": "Do not use when you need an enrollment secret or need to change a client.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can view connector taps.",
              "description": "You cannot view Pulse clients in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the matching clients, including clients that were revoked.",
          "title": "List Pulse clients",
          "useWhen": "Use when you need to inspect enrolled Pulse clients for the selected Workspace or Provider connection.",
          "visibility": "internal"
        }
      }
    },
    "/api/devices/capture-policy": {
      "get": {
        "description": "Returns the apps that Pulse skips on every Mac in this Workspace, as bundle ID prefixes. Pulse also always skips its built-in list of password managers, banking apps, and health apps.",
        "operationId": "DevicesPulseCapturePolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PulseCapturePolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Get skipped apps",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.capture-policy.get",
          "description": "Returns the apps that Pulse skips on every Mac in this Workspace, as bundle ID prefixes. Pulse also always skips its built-in list of password managers, banking apps, and health apps.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can view connector taps.",
              "description": "You cannot view Pulse settings in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Get skipped apps",
          "visibility": "internal"
        }
      },
      "put": {
        "description": "Replaces the list of apps that Pulse skips on every Mac in this Workspace. Give each app as a bundle ID prefix, such as com.tinyspeck.slackmacgap. Pulse records only which skipped app was in front and for how long. Macs apply the change within six hours.",
        "operationId": "DevicesSetPulseCapturePolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPulseCapturePolicyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PulseCapturePolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set skipped apps",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.capture-policy.set",
          "description": "Replaces the list of apps that Pulse skips on every Mac in this Workspace. Give each app as a bundle ID prefix, such as com.tinyspeck.slackmacgap. Pulse records only which skipped app was in front and for how long. Macs apply the change within six hours.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Give each app as a bundle ID with at least two parts, such as com.example.app, and send at most 200 entries.",
              "description": "An entry is not a bundle ID prefix, an entry is longer than 255 characters, or the list has more than 200 entries."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can manage connector taps.",
              "description": "You cannot change Pulse settings in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Set skipped apps",
          "visibility": "internal"
        }
      }
    },
    "/api/devices/enroll": {
      "post": {
        "description": "Exchanges a single-use enrollment secret and client public key for a registered Pulse client and the apps it must skip. The secret cannot be reused.",
        "operationId": "DevicesEnrollDeviceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollDeviceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/EnrollDeviceResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Enroll",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "pulse.client-registration.enroll",
          "description": "Exchanges a single-use enrollment secret and client public key for a registered Pulse client and the apps it must skip. The secret cannot be reused.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Enroll",
          "visibility": "internal"
        }
      }
    },
    "/api/devices/enrollment-secrets": {
      "get": {
        "description": "Lists Pulse client enrollment-secret metadata for the current Workspace; plaintext secrets are never returned. Optionally filters by provider connection.",
        "operationId": "DevicesDeviceEnrollmentSecretsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "tenantConnectorId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/DeviceEnrollmentSecretInfo"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Enrollment secrets",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.client-registration.enrollment-secrets",
          "description": "Lists Pulse client enrollment-secret metadata for the current Workspace; plaintext secrets are never returned. Optionally filters by provider connection.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Enrollment secrets",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Creates a single-use secret for enrolling a Pulse client and returns the plaintext once. Only a hash is stored.",
        "operationId": "DevicesMintDeviceEnrollmentSecretHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MintDeviceEnrollmentSecretInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MintDeviceEnrollmentSecretResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Mint secret",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.client-registration.mint-secret",
          "description": "Creates a single-use secret for enrolling a Pulse client and returns the plaintext once. Only a hash is stored.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Mint secret",
          "visibility": "internal"
        }
      }
    },
    "/api/devices/enrollment-secrets/{id}/revoke": {
      "post": {
        "description": "Stops an unused Pulse client enrollment secret from enrolling a client. Doing it twice is harmless; a used secret cannot be revoked.",
        "operationId": "DevicesRevokeDeviceEnrollmentSecretHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Revoke secret",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.client-registration.revoke-secret",
          "description": "Stops an unused Pulse client enrollment secret from enrolling a client. Doing it twice is harmless; a used secret cannot be revoked.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a secret identifier returned by the selected Workspace.",
              "description": "The enrollment secret does not exist in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Revoke the Pulse client that the secret enrolled.",
              "description": "A Pulse client already enrolled with this secret."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Revoke secret",
          "visibility": "internal"
        }
      }
    },
    "/api/devices/rekey": {
      "post": {
        "description": "Replaces the public key for an enrolled Pulse client after the existing key proves possession. Revoked clients, and clients whose person is not an active Workspace member, cannot rekey.",
        "operationId": "DevicesRekeyDeviceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RekeyDeviceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Rekey",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "pulse.client-registration.rekey",
          "description": "Replaces the public key for an enrolled Pulse client after the existing key proves possession. Revoked clients, and clients whose person is not an active Workspace member, cannot rekey.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Rekey",
          "visibility": "internal"
        }
      }
    },
    "/api/devices/routing-token": {
      "post": {
        "description": "Returns the current ingest routing token and the apps to skip for an enrolled Pulse client after its key proves possession. Revoked clients, and clients whose person is not an active Workspace member, get no token.",
        "operationId": "DevicesRefreshDeviceRoutingTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshDeviceRoutingTokenInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DeviceRoutingTokenResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Refresh routing token",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "pulse.client-registration.refresh-routing-token",
          "description": "Returns the current ingest routing token and the apps to skip for an enrolled Pulse client after its key proves possession. Revoked clients, and clients whose person is not an active Workspace member, get no token.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Refresh routing token",
          "visibility": "internal"
        }
      }
    },
    "/api/devices/unenroll": {
      "post": {
        "description": "Revokes the calling Pulse client after its key proves possession, so the client can leave the Workspace by itself. Doing it twice is harmless.",
        "operationId": "DevicesUnenrollDeviceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnenrollDeviceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Unenroll",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "pulse.client-registration.unenroll",
          "description": "Revokes the calling Pulse client after its key proves possession, so the client can leave the Workspace by itself. Doing it twice is harmless.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Unenroll",
          "visibility": "internal"
        }
      }
    },
    "/api/devices/{id}/revoke": {
      "post": {
        "description": "Stops an enrolled Pulse client from connecting to this Workspace. Doing it twice is harmless.",
        "operationId": "DevicesRevokeDeviceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Revoke a Pulse client",
        "tags": [
          "devices"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.client-registration.revoke",
          "description": "Stops an enrolled Pulse client from connecting to this Workspace. Doing it twice is harmless.",
          "doNotUseWhen": "Do not use when you only need to inspect the client list.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a client identifier returned by the selected Workspace.",
              "description": "The Pulse client does not exist in this Workspace."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can manage connector taps.",
              "description": "You cannot revoke Pulse clients in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Revokes the client; repeating the request is harmless.",
          "title": "Revoke a Pulse client",
          "useWhen": "Use when a Pulse client must no longer connect to the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/earlyaccess/catalog": {
      "get": {
        "description": "Returns the labs and preview releases currently listed under Early Access. You need Early Access turned on for this Workspace to see them.",
        "operationId": "EarlyaccessCatalogHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/EarlyAccessCatalogItem"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Early Access releases",
        "tags": [
          "earlyaccess"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "platform.early-access.catalog",
          "description": "Returns the labs and preview releases currently listed under Early Access. You need Early Access turned on for this Workspace to see them.",
          "doNotUseWhen": "Do not use when you need to change feature availability.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace with Early Access viewing permission.",
              "description": "Early Access is unavailable to this Workspace or your account."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the releases visible through this Workspace’s Early Access access.",
          "title": "List Early Access releases",
          "useWhen": "Use when you need the Early Access releases available to the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/earlyaccess/flags/{slug}": {
      "get": {
        "description": "Says whether one Early Access feature is turned on for this Workspace. Use it to decide whether to show a page at all.",
        "operationId": "EarlyaccessFlagHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "slug parameter",
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "description": "A URL friendly version of a string",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/EarlyAccessFlagStatus"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check whether a feature is on",
        "tags": [
          "earlyaccess"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "platform.early-access.flag",
          "description": "Says whether one Early Access feature is turned on for this Workspace. Use it to decide whether to show a page at all.",
          "doNotUseWhen": "Do not use when you need the complete Early Access catalog.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace with Early Access viewing permission.",
              "description": "Early Access is unavailable to this Workspace or your account."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the feature slug and whether it is enabled for the Workspace.",
          "title": "Check whether a feature is on",
          "useWhen": "Use when you need to decide whether one Early Access feature is enabled in the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/earlyaccess/organization-overview/rollup": {
      "get": {
        "description": "Returns active headcount by division, department and team for the Organization Overview preview. It runs one fixed query over the Workspace’s HR team data and takes no SQL.",
        "operationId": "EarlyaccessOrganizationOverviewRollupHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/OrganizationOverviewRollupRow"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the Organization Overview headcount",
        "tags": [
          "earlyaccess"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "platform.early-access.organization-overview",
          "description": "Returns active headcount by division, department and team for the Organization Overview preview. It runs one fixed query over the Workspace’s HR team data and takes no SQL.",
          "doNotUseWhen": "Do not use when you need to run your own SQL, or when a saved panel snapshot exists.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where the Organization Overview preview is turned on and you can view Early Access.",
              "description": "Early Access, or the Organization Overview preview, is unavailable to this Workspace or your account."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns one row per team with its division, department, team and headcount. An empty list means the Workspace has no HR team data yet.",
          "title": "Read the Organization Overview headcount",
          "useWhen": "Use when the Organization Overview preview has no saved snapshot and needs its live headcount rows.",
          "visibility": "internal"
        }
      }
    },
    "/api/earlyaccess/panel-snapshots/{panelSlug}": {
      "get": {
        "description": "Returns the frozen rows captured for one release panel. If nothing has been captured for this Workspace, callers fall back to reading live data instead.",
        "operationId": "EarlyaccessPanelSnapshotHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "panelSlug parameter",
            "in": "path",
            "name": "panelSlug",
            "required": true,
            "schema": {
              "description": "A URL friendly version of a string",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReleasePanelSnapshotInfo"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a saved release panel",
        "tags": [
          "earlyaccess"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "platform.early-access.panel-snapshot",
          "description": "Returns the frozen rows captured for one release panel. If nothing has been captured for this Workspace, callers fall back to reading live data instead.",
          "doNotUseWhen": "Do not use when you need live release data or need to create a snapshot.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Use the live release-data path or choose a panel with a captured snapshot.",
              "description": "No saved snapshot exists for that panel in this Workspace."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace with Early Access viewing permission.",
              "description": "Early Access is unavailable to this Workspace or your account."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the saved panel snapshot for the selected Workspace.",
          "title": "Read a saved release panel",
          "useWhen": "Use when you need the frozen rows previously captured for an Early Access release panel.",
          "visibility": "internal"
        }
      }
    },
    "/api/ingest-tokens": {
      "get": {
        "description": "Lists this Workspace's ingestion tokens, newest first, including revoked and expired ones so you can see the whole history.",
        "operationId": "IngestTokensIngestTokensHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "tenantConnectorTapId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/IngestTokenInfo"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List ingestion tokens",
        "tags": [
          "ingest-tokens"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.ingest-tokens.ingest-tokens",
          "description": "Lists this Workspace's ingestion tokens, newest first, including revoked and expired ones so you can see the whole history.",
          "doNotUseWhen": "Do not use when you need a token value, need to mint one, or need to rotate one.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can view connector taps.",
              "description": "You cannot view ingestion-token metadata in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns matching token metadata without token values.",
          "title": "List ingestion tokens",
          "useWhen": "Use when you need metadata and status for ingestion tokens in the selected Workspace.",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "POST /api/ingest-tokens\nMint a new ingest token for a collector TenantConnectorTap. The plaintext\nis returned exactly once in MintIngestTokenResult.token (with the full\nendpoint URL); only the SHA-256 hash is persisted. Refused with a typed\nerror if the tap already has a live (non-revoked, non-expired) token --\nuse rotateIngestToken instead.",
        "operationId": "IngestTokensMintIngestTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MintIngestTokenInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MintIngestTokenResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "mintIngestToken",
        "tags": [
          "ingest-tokens"
        ]
      }
    },
    "/api/ingest-tokens/{id}/revoke": {
      "post": {
        "description": "Stops an ingestion token from sending any more data.",
        "operationId": "IngestTokensRevokeIngestTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Revoke an ingestion token",
        "tags": [
          "ingest-tokens"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pulse.ingest-tokens.revoke-ingest-token",
          "description": "Stops an ingestion token from sending any more data.",
          "doNotUseWhen": "Do not use when you need a replacement token; token rotation is a separate protected flow.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a token identifier returned by the selected Workspace.",
              "description": "The ingestion token does not exist in this Workspace."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can manage connector taps.",
              "description": "You cannot revoke ingestion tokens in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Revokes the token; repeating the request is harmless.",
          "title": "Revoke an ingestion token",
          "useWhen": "Use when an ingestion token must stop accepting data for the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/ingest-tokens/{id}/rotate": {
      "post": {
        "description": "POST /api/ingest-tokens/{id}/rotate\nRotate an ingest token: mints a replacement for the same tap and puts the\nold token into a rotation grace window (expiresAt set server-side) so\nsenders with the URL registered in a vendor console have time to update.\nReturns the new token's plaintext exactly once. Returns 404 if the token\ndoes not exist or belongs to a different tenant.",
        "operationId": "IngestTokensRotateIngestTokenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MintIngestTokenResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "rotateIngestToken",
        "tags": [
          "ingest-tokens"
        ]
      }
    },
    "/api/internal/artifact-work/actions/complete": {
      "post": {
        "description": "Records the result of the current immutable storage job. Only the verified query-runner service may call this operation; stale or conflicting results cannot make an Artifact available.",
        "operationId": "ArtifactsCompleteArtifactWorkHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArtifactStorageWorkResult"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CompleteArtifactWorkResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Record Artifact storage completion",
        "tags": [
          "artifacts"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "providers.artifacts.complete-storage-work",
          "description": "Records the result of the current immutable storage job. Only the verified query-runner service may call this operation; stale or conflicting results cannot make an Artifact available.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Record Artifact storage completion",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder-runner/problem-runs/{runId}/actions/bind": {
      "post": {
        "description": "Binds the admission-queue unit and duroxide orchestration instance that will drive a pending Ponder Run, moving its dispatch to bound and recording the duroxide adapter with the unit id. The dispatch digest must equal the Run's sealed one. Idempotent for the same unit; another unit conflicts. The caller is the ponder-runner service identity; browser clients never call it.",
        "operationId": "PonderRunnerBindPonderRunHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BindPonderRunInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRun"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Bind a Run to its durable orchestration",
        "tags": [
          "ponder-runner"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.bind",
          "description": "Binds the admission-queue unit and duroxide orchestration instance that will drive a pending Ponder Run, moving its dispatch to bound and recording the duroxide adapter with the unit id. The dispatch digest must equal the Run's sealed one. Idempotent for the same unit; another unit conflicts. The caller is the ponder-runner service identity; browser clients never call it.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Bind a Run to its durable orchestration",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder-runner/problem-runs/{runId}/transitions": {
      "post": {
        "description": "Records one orchestration-driven Run status transition (running, waiting for approval, waiting for a Ping, cancelling, failed, cancelled, or terminal) with the turn segment it follows and, for a failure, the runner's error code. It is the only write the orchestrator makes, so a Run still reaches failed or cancelled when ponder-api is unreachable. Idempotent on the idempotency key. The caller is the ponder-runner service identity.",
        "operationId": "PonderRunnerRecordPonderRunTransitionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderRunTransitionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRun"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Record a Run transition",
        "tags": [
          "ponder-runner"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.transitions.record",
          "description": "Records one orchestration-driven Run status transition (running, waiting for approval, waiting for a Ping, cancelling, failed, cancelled, or terminal) with the turn segment it follows and, for a failure, the runner's error code. It is the only write the orchestrator makes, so a Run still reaches failed or cancelled when ponder-api is unreachable. Idempotent on the idempotency key. The caller is the ponder-runner service identity.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Record a Run transition",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable-messages/{messageId}/panes/actions/preview": {
      "post": {
        "description": "Builds everything a browser needs to draw one Pane of a Parable the author of an accepted ordinary Ponder Message may see: the compiled modules, resolved data, runtime bindings, and permitted Preferences. A Parable or Pane that cannot be drawn answers with a status and the Panes that exist.",
        "operationId": "ParableProblemRuntimePreviewParableProblemMessagePaneHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "messageId parameter",
            "in": "path",
            "name": "messageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PreviewParableProblemMessagePaneInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PreviewParableProblemMessagePaneResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Preview a Message Pane",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.panes.preview",
          "description": "Builds everything a browser needs to draw one Pane of a Parable the author of an accepted ordinary Ponder Message may see: the compiled modules, resolved data, runtime bindings, and permitted Preferences. A Parable or Pane that cannot be drawn answers with a status and the Panes that exist.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Preview a Message Pane",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable-messages/{messageId}/panes/actions/resolve-preview": {
      "post": {
        "description": "Resolves a batch of Pane data requests for a preview that is being captured, as the author of an accepted ordinary Ponder Message. The capture page never holds a token; this callback is its only way to ask for data.",
        "operationId": "ParableProblemRuntimeResolveParableProblemMessagePanePreviewHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "messageId parameter",
            "in": "path",
            "name": "messageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResolveParableProblemMessagePanePreviewInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePaneResolveBatchResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Resolve a Message Pane preview",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.panes.resolve-preview",
          "description": "Resolves a batch of Pane data requests for a preview that is being captured, as the author of an accepted ordinary Ponder Message. The capture page never holds a token; this callback is its only way to ask for data.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Resolve a Message Pane preview",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable-messages/{messageId}/pings/actions/ask": {
      "post": {
        "description": "Records the questions a model puts to the people in a conversation as one Ping in the Problem, asked as the author of the accepted ordinary Ponder Message. Who may answer is decided later by Pinging participation, never by the asker. A refused ask answers with a recovery hint rather than an error.",
        "operationId": "ParableProblemRuntimeAskParableProblemMessagePingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "messageId parameter",
            "in": "path",
            "name": "messageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AskParableProblemMessagePingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AskParableProblemMessagePingResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Ask a Message Ping",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.pings.ask",
          "description": "Records the questions a model puts to the people in a conversation as one Ping in the Problem, asked as the author of the accepted ordinary Ponder Message. Who may answer is decided later by Pinging participation, never by the asker. A refused ask answers with a recovery hint rather than an error.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Ask a Message Ping",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable-messages/{messageId}/powers/actions/read": {
      "post": {
        "description": "Returns one Workspace Power with its instructions and reference files for the author of an accepted ordinary Ponder Message. An unknown name answers not found with a recovery hint rather than an error.",
        "operationId": "ParableProblemRuntimeReadParableProblemMessagePowerHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "messageId parameter",
            "in": "path",
            "name": "messageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReadParableProblemMessagePowerInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReadParableProblemMessagePowerResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Message Power",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.powers.read",
          "description": "Returns one Workspace Power with its instructions and reference files for the author of an accepted ordinary Ponder Message. An unknown name answers not found with a recovery hint rather than an error.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Read a Message Power",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable-messages/{messageId}/powers/actions/search": {
      "post": {
        "description": "Ranks the Workspace Powers by name, title, and description for the author of an accepted ordinary Ponder Message and returns front matter only. Instructions are not searched; read one Power separately.",
        "operationId": "ParableProblemRuntimeSearchParableProblemMessagePowersHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "messageId parameter",
            "in": "path",
            "name": "messageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchParableProblemMessagePowersInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SearchParableProblemMessagePowersResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Search Message Powers",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.powers.search",
          "description": "Ranks the Workspace Powers by name, title, and description for the author of an accepted ordinary Ponder Message and returns front matter only. Instructions are not searched; read one Power separately.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Search Message Powers",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable-messages/{messageId}/tool-approvals/actions/issue": {
      "post": {
        "description": "Records the pending Ask approval that the streaming assistant Message showed the person, bound to the exact actor, Message, tool call, arguments digest, and committed model execution. Replaying the same approval identity returns the pending record; a different one conflicts.",
        "operationId": "ParableProblemRuntimeIssueParableProblemMessageToolApprovalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "messageId parameter",
            "in": "path",
            "name": "messageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IssueParableProblemMessageToolApprovalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/IssueParableProblemMessageToolApprovalResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Issue a Message tool approval",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.tool-approvals.issue",
          "description": "Records the pending Ask approval that the streaming assistant Message showed the person, bound to the exact actor, Message, tool call, arguments digest, and committed model execution. Replaying the same approval identity returns the pending record; a different one conflicts.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Issue a Message tool approval",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable-messages/{messageId}/tools/actions/discover": {
      "post": {
        "description": "Searches the generated Workspace API registry for one accepted ordinary Ponder Message after the Message author, Problem, context proof, and tool policy (Workspace defaults and Power membership) are reloaded. Each item reports whether it is available now under that policy.",
        "operationId": "ParableProblemRuntimeDiscoverParableProblemMessageToolsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "messageId parameter",
            "in": "path",
            "name": "messageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DiscoverParableProblemMessageToolsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DiscoverParableProblemMessageToolsResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Discover Message tools",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.tools.discover",
          "description": "Searches the generated Workspace API registry for one accepted ordinary Ponder Message after the Message author, Problem, context proof, and tool policy (Workspace defaults and Power membership) are reloaded. Each item reports whether it is available now under that policy.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Discover Message tools",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable-messages/{messageId}/tools/actions/invoke": {
      "post": {
        "description": "Invokes one authorized generated Workspace operation as the author of an accepted ordinary Ponder Message. Mutations are admitted through a durable receipt so a Provider retry cannot repeat an effect; the result status says whether the effect completed, is still in progress, was refused, or cannot be known.",
        "operationId": "ParableProblemRuntimeInvokeParableProblemMessageToolHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "messageId parameter",
            "in": "path",
            "name": "messageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvokeParableProblemMessageToolInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/InvokeParableProblemMessageToolResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Invoke a Message tool",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.tools.invoke",
          "description": "Invokes one authorized generated Workspace operation as the author of an accepted ordinary Ponder Message. Mutations are admitted through a durable receipt so a Provider retry cannot repeat an effect; the result status says whether the effect completed, is still in progress, was refused, or cannot be known.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Invoke a Message tool",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/parable/{problemId}/messages/actions/complete": {
      "post": {
        "description": "Stores the terminal assistant Message of one ordinary Ponder exchange: its product parts, its status, the AI SDK UI message readers see, and the pi session entries the turn appended to the Problem journal. The assistant identity must be the one derived from the accepted user Message.",
        "operationId": "ParableProblemRuntimeCompleteParableProblemMessageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteParableProblemMessageInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemMessage"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Complete a Message",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-messages.complete",
          "description": "Stores the terminal assistant Message of one ordinary Ponder exchange: its product parts, its status, the AI SDK UI message readers see, and the pi session entries the turn appended to the Problem journal. The assistant identity must be the one derived from the accepted user Message.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Complete a Message",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/actions/complete": {
      "post": {
        "description": "Commits the normalized final assistant message, safe usage and outcome, terminal Run state, and product facts exactly once. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimeCompleteParableProblemRunHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteParableProblemRunInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRun"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Complete a Problem Run",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.complete",
          "description": "Commits the normalized final assistant message, safe usage and outcome, terminal Run state, and product facts exactly once. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Complete a Problem Run",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/approvals": {
      "post": {
        "description": "Commits a durable Parable approval. A Run the Ponder runner drives keeps running, so the rest of the step's tool batch still runs, and its orchestration records the wait when the step ends; any other Run moves to waiting before its executor suspends. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimeRequestParableProblemRunApprovalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RequestParableProblemRunApprovalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRunApproval"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Request a Run approval",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.approvals.request",
          "description": "Commits a durable Parable approval. A Run the Ponder runner drives keeps running, so the rest of the step's tool batch still runs, and its orchestration records the wait when the step ends; any other Run moves to waiting before its executor suspends. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Request a Run approval",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/diagnostics": {
      "post": {
        "description": "Appends one sanitized diagnostic event to a Run whose employee Debug policy was enabled at acceptance. Secret-bearing inputs, unauthorized data, raw provider payloads, and hidden reasoning are rejected by the service boundary.",
        "operationId": "ParableProblemRuntimeRecordParableProblemRunDiagnosticEventHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordParableProblemRunDiagnosticEventInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRunDiagnosticEventView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Record a Problem Run diagnostic event",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.diagnostics.record",
          "description": "Appends one sanitized diagnostic event to a Run whose employee Debug policy was enabled at acceptance. Secret-bearing inputs, unauthorized data, raw provider payloads, and hidden reasoning are rejected by the service boundary.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Record a Problem Run diagnostic event",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/panes/actions/preview": {
      "post": {
        "description": "Builds everything a browser needs to draw one Pane of a Parable the person who started a durable Run may see, exactly as the Message-scoped preview does, with the Run's accepted context in place of a Message's. A Parable or Pane that cannot be drawn answers with a status and the Panes that exist. The Run, digest, and Workspace rules are those of Search Run Powers. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimePreviewParableProblemRunPaneHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PreviewParableProblemRunPaneInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PreviewParableProblemMessagePaneResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Preview a Run Pane",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.panes.preview",
          "description": "Builds everything a browser needs to draw one Pane of a Parable the person who started a durable Run may see, exactly as the Message-scoped preview does, with the Run's accepted context in place of a Message's. A Parable or Pane that cannot be drawn answers with a status and the Panes that exist. The Run, digest, and Workspace rules are those of Search Run Powers. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Preview a Run Pane",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/panes/actions/resolve-preview": {
      "post": {
        "description": "Resolves a batch of Pane data requests for a preview a durable Run is capturing, as the person who started the Run. The capture page never holds a token; this callback is its only way to ask for data. The Run, digest, and Workspace rules are those of Search Run Powers. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimeResolveParableProblemRunPanePreviewHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResolveParableProblemRunPanePreviewInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePaneResolveBatchResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Resolve a Run Pane preview",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.panes.resolve-preview",
          "description": "Resolves a batch of Pane data requests for a preview a durable Run is capturing, as the person who started the Run. The capture page never holds a token; this callback is its only way to ask for data. The Run, digest, and Workspace rules are those of Search Run Powers. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Resolve a Run Pane preview",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/pings/actions/ask": {
      "post": {
        "description": "Records the questions a model in a durable Run puts to the people in its Problem as one Ping, asked as the person who started the Run under the Run's sealed tool grant, attached to the Run's assistant Message and addressed to that person. The Workspace is the one sealed into the Run, so X-Tenant may be omitted; a Run the runner has not bound, a digest that is not the sealed one, or a Run that is not running is refused with 409. The same idempotency key with the same questions returns the Ping already asked. A refused ask answers with a recovery hint rather than an error. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimeAskParableProblemRunPingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AskParableProblemRunPingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AskParableProblemMessagePingResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Ask a Run Ping",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.pings.ask",
          "description": "Records the questions a model in a durable Run puts to the people in its Problem as one Ping, asked as the person who started the Run under the Run's sealed tool grant, attached to the Run's assistant Message and addressed to that person. The Workspace is the one sealed into the Run, so X-Tenant may be omitted; a Run the runner has not bound, a digest that is not the sealed one, or a Run that is not running is refused with 409. The same idempotency key with the same questions returns the Ping already asked. A refused ask answers with a recovery hint rather than an error. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Ask a Run Ping",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/pings/actions/read": {
      "post": {
        "description": "Returns one Ping a durable Run asked, with its responses, so a resumed turn segment can settle the held question with the answers. Only a Ping attached to this Run's assistant Message is found; any other Ping is not found. The Workspace is the one sealed into the Run, and the digest must be the sealed one. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimeReadParableProblemRunPingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReadParableProblemRunPingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Run Ping",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.pings.read",
          "description": "Returns one Ping a durable Run asked, with its responses, so a resumed turn segment can settle the held question with the answers. Only a Ping attached to this Run's assistant Message is found; any other Ping is not found. The Workspace is the one sealed into the Run, and the digest must be the sealed one. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Read a Run Ping",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/powers/actions/read": {
      "post": {
        "description": "Returns one Workspace Power with its instructions and reference files for a model in a durable Run, read as the person who started the Run from the Workspace sealed into it. An unknown name answers not found with a recovery hint rather than an error. The Run, digest, and Workspace rules are those of Search Run Powers. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimeReadParableProblemRunPowerHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReadParableProblemRunPowerInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReadParableProblemMessagePowerResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Run Power",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.powers.read",
          "description": "Returns one Workspace Power with its instructions and reference files for a model in a durable Run, read as the person who started the Run from the Workspace sealed into it. An unknown name answers not found with a recovery hint rather than an error. The Run, digest, and Workspace rules are those of Search Run Powers. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Read a Run Power",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/powers/actions/search": {
      "post": {
        "description": "Ranks the Workspace Powers by name, title, and description for a model in a durable Run and returns front matter only, as the Message-scoped search does. The shelf is the one of the Workspace sealed into the Run, searched as the person who started the Run under their current access, so X-Tenant may be omitted and one naming another Workspace is refused with 403. A Run the runner has not bound, a digest that is not the sealed one, or a Run that is neither running nor cancelling is refused with 409. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimeSearchParableProblemRunPowersHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchParableProblemRunPowersInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SearchParableProblemMessagePowersResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Search Run Powers",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.powers.search",
          "description": "Ranks the Workspace Powers by name, title, and description for a model in a durable Run and returns front matter only, as the Message-scoped search does. The shelf is the one of the Workspace sealed into the Run, searched as the person who started the Run under their current access, so X-Tenant may be omitted and one naming another Workspace is refused with 403. A Run the runner has not bound, a digest that is not the sealed one, or a Run that is neither running nor cancelling is refused with 409. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Search Run Powers",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/session-entries": {
      "post": {
        "description": "Stores the pi journal entries one turn segment of a durable Run appended since its last flush, in order, after the Run's own journal. ponder-api flushes after every message, so a retried segment resumes from the last stored entry. An entry whose pi id is already stored is skipped. The first new entry must continue the stored tail, or be the session header naming the Run when the journal is empty; otherwise the call answers 409 WA-PR-004 instead of forking the journal. Only the newest attempt of a started, unfinished step may append: a completed step answers 409 WA-PR-002 with its stored outcome and an older attempt 409 WA-PR-003. Internal runtime service operation guarded by the Workspace and dispatch digest sealed into the Run.",
        "operationId": "ParableProblemRuntimeAppendParableProblemRunSessionEntriesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppendParableProblemRunSessionEntriesInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AppendParableProblemRunSessionEntriesResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Append Run journal entries",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.session-entries.append",
          "description": "Stores the pi journal entries one turn segment of a durable Run appended since its last flush, in order, after the Run's own journal. ponder-api flushes after every message, so a retried segment resumes from the last stored entry. An entry whose pi id is already stored is skipped. The first new entry must continue the stored tail, or be the session header naming the Run when the journal is empty; otherwise the call answers 409 WA-PR-004 instead of forking the journal. Only the newest attempt of a started, unfinished step may append: a completed step answers 409 WA-PR-002 with its stored outcome and an older attempt 409 WA-PR-003. Internal runtime service operation guarded by the Workspace and dispatch digest sealed into the Run.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Append Run journal entries",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/steps": {
      "post": {
        "description": "Records one attempt of a durable Run's turn segment in the step ledger: started before it runs, then completed with its outcome or failed. A newer attempt supersedes an older one, which can no longer write. Replaying the call that last wrote the attempt is a no-op. A step that already completed answers 409 WA-PR-002 with its stored outcome, so a retried activity never runs the model again; an older attempt answers 409 WA-PR-003. Internal runtime service operation guarded by the Workspace and dispatch digest sealed into the Run.",
        "operationId": "ParableProblemRuntimeRecordParableProblemRunStepHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordParableProblemRunStepInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RecordParableProblemRunStepResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Record a Run step",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.steps.record",
          "description": "Records one attempt of a durable Run's turn segment in the step ledger: started before it runs, then completed with its outcome or failed. A newer attempt supersedes an older one, which can no longer write. Replaying the call that last wrote the attempt is a no-op. A step that already completed answers 409 WA-PR-002 with its stored outcome, so a retried activity never runs the model again; an older attempt answers 409 WA-PR-003. Internal runtime service operation guarded by the Workspace and dispatch digest sealed into the Run.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Record a Run step",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/steps/actions/load": {
      "post": {
        "description": "Returns what one turn segment of a durable Run needs before it runs: the sealed dispatch snapshot exactly as acceptance persisted it, the Run as it is now, its approvals with their decisions, the Run's assistant Message still streaming, and the next stream sequence for the step. The Workspace is the one sealed into the Run, so X-Tenant may be omitted; one naming another Workspace is refused. A Run the runner has not bound, or a digest that is not the sealed one, is refused with 409, and a step that already completed answers 409 WA-PR-002 with its stored outcome. Internal runtime service operation.",
        "operationId": "ParableProblemRuntimeLoadParableProblemRunStepHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoadParableProblemRunStepInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderRunStepContext"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Load a Run step",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.steps.load",
          "description": "Returns what one turn segment of a durable Run needs before it runs: the sealed dispatch snapshot exactly as acceptance persisted it, the Run as it is now, its approvals with their decisions, the Run's assistant Message still streaming, and the next stream sequence for the step. The Workspace is the one sealed into the Run, so X-Tenant may be omitted; one naming another Workspace is refused. A Run the runner has not bound, or a digest that is not the sealed one, is refused with 409, and a step that already completed answers 409 WA-PR-002 with its stored outcome. Internal runtime service operation.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Load a Run step",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/stream-chunks": {
      "post": {
        "description": "Stores one batch of public stream parts for the assistant Message of a durable Run, in sequence order within the step, and records one Message fact for the batch so subscribed browsers fetch the new range. The first batch creates the streaming assistant Message. Only the newest attempt of a started, unfinished step may append; a completed step answers 409 WA-PR-002 and an older attempt 409 WA-PR-003. Idempotent on (Run, step index, sequence): a stored sequence is skipped and not counted. Internal runtime service operation guarded by the Workspace and dispatch digest sealed into the Run.",
        "operationId": "ParableProblemRuntimeAppendParableProblemRunStreamChunksHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppendParableProblemRunStreamChunksInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AppendParableProblemRunStreamChunksResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Append Run stream chunks",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.stream-chunks.append",
          "description": "Stores one batch of public stream parts for the assistant Message of a durable Run, in sequence order within the step, and records one Message fact for the batch so subscribed browsers fetch the new range. The first batch creates the streaming assistant Message. Only the newest attempt of a started, unfinished step may append; a completed step answers 409 WA-PR-002 and an older attempt 409 WA-PR-003. Idempotent on (Run, step index, sequence): a stored sequence is skipped and not counted. Internal runtime service operation guarded by the Workspace and dispatch digest sealed into the Run.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Append Run stream chunks",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/tools/actions/discover": {
      "post": {
        "description": "Searches the run-scoped generated Workspace API registry after current actor, Workspace, Problem, RACI, context, and tool-policy authorization are reloaded. Admin, authentication, environment, and unrelated system operations are excluded.",
        "operationId": "ParableProblemRuntimeDiscoverParableProblemRunToolsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DiscoverParableProblemRunToolsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DiscoverParableProblemRunToolsResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Discover generated Problem Run tools",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.tools.discover",
          "description": "Searches the run-scoped generated Workspace API registry after current actor, Workspace, Problem, RACI, context, and tool-policy authorization are reloaded. Admin, authentication, environment, and unrelated system operations are excluded.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Discover generated Problem Run tools",
          "visibility": "internal"
        }
      }
    },
    "/api/internal/ponder/problem-runs/{runId}/tools/actions/invoke": {
      "post": {
        "description": "Invokes one authorized generated Workspace operation through the run-scoped broker after revalidating current authority for the actual operation target. Context links and selected Pieces are optional orientation. Tool policy controls approval, and operation inputs, revision checks, and durable replay requirements still apply.",
        "operationId": "ParableProblemRuntimeInvokeParableProblemRunToolHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvokeParableProblemRunToolInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/InvokeParableProblemRunToolResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Invoke a generated Problem Run tool",
        "tags": [
          "parable-problem-runtime"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "ponder.runtime.problem-runs.tools.invoke",
          "description": "Invokes one authorized generated Workspace operation through the run-scoped broker after revalidating current authority for the actual operation target. Context links and selected Pieces are optional orientation. Tool policy controls approval, and operation inputs, revision checks, and durable replay requirements still apply.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Invoke a generated Problem Run tool",
          "visibility": "internal"
        }
      }
    },
    "/api/model-policy": {
      "get": {
        "description": "Returns the selected Workspace’s AI model policy: the processors Parable staff allow, the processors the Workspace switched off, its default model per capability, and the effective policy every AI call applies. Requires permission to manage the Workspace’s AI processors.",
        "operationId": "ModelPolicyGetModelPolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceModelPolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read which AI processors may use Workspace data",
        "tags": [
          "model-policy"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.ai-processors.model-policy",
          "description": "Returns the selected Workspace’s AI model policy: the processors Parable staff allow, the processors the Workspace switched off, its default model per capability, and the effective policy every AI call applies. Requires permission to manage the Workspace’s AI processors.",
          "doNotUseWhen": "Do not use to change the policy; people change it on the Workspace settings page.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Select a Workspace before reading its model policy.",
              "description": "The request has no Workspace context."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the stored policy and the effective policy for every capability.",
          "title": "Read which AI processors may use Workspace data",
          "useWhen": "Use when you need to know which AI processors and default models the selected Workspace allows, or why an AI call was refused.",
          "visibility": "internal"
        }
      }
    },
    "/api/model-policy/effective": {
      "get": {
        "description": "Returns the effective model policy web-api computes for the selected Workspace: the eligible processors and the default model for each capability, the Vertex project, the stored policy version and a digest to cache by. The query layer and query-runner read it with a service token.",
        "operationId": "ModelPolicyGetEffectiveModelPolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/EffectiveModelPolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Workspace’s effective AI model policy",
        "tags": [
          "model-policy"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "protection.ai-processors.effective-model-policy",
          "description": "Returns the effective model policy web-api computes for the selected Workspace: the eligible processors and the default model for each capability, the Vertex project, the stored policy version and a digest to cache by. The query layer and query-runner read it with a service token.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read a Workspace’s effective AI model policy",
          "visibility": "internal"
        }
      }
    },
    "/api/model-policy/preferences": {
      "put": {
        "description": "Replaces the processors the selected Workspace switches off and its default model for chat, ponder() and model(), Jev, and schema inference. A Workspace can only switch off processors within the staff ceiling, and embedding models stay platform-only. Returns the stored and effective policy.",
        "operationId": "ModelPolicySetModelPreferencesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetModelPreferencesInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceModelPolicy"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set the Workspace’s AI processors and default models",
        "tags": [
          "model-policy"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.ai-processors.set-model-preferences",
          "description": "Replaces the processors the selected Workspace switches off and its default model for chat, ponder() and model(), Jev, and schema inference. A Workspace can only switch off processors within the staff ceiling, and embedding models stay platform-only. Returns the stored and effective policy.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Set the Workspace’s AI processors and default models",
          "visibility": "internal"
        }
      }
    },
    "/api/model-policy/preferences/preview": {
      "post": {
        "description": "Works out what saving the given AI processor and default model choices would do to the selected Workspace: which features stop, which come back and which default models change. It applies the same checks as saving and stores nothing. Requires permission to manage the Workspace’s AI processors.",
        "operationId": "ModelPolicyPreviewModelPreferencesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetModelPreferencesInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ModelPreferencesPreview"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Preview a change to the Workspace’s AI processors",
        "tags": [
          "model-policy"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.ai-processors.preview-model-preferences",
          "description": "Works out what saving the given AI processor and default model choices would do to the selected Workspace: which features stop, which come back and which default models change. It applies the same checks as saving and stores nothing. Requires permission to manage the Workspace’s AI processors.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Preview a change to the Workspace’s AI processors",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/command-receipts/{receiptId}": {
      "get": {
        "description": "Returns the receipt for one earlier command, so you can confirm it completed and see which revision it produced.",
        "operationId": "ParableAuthoringWorkspaceParableCommandReceiptHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "receiptId parameter",
            "in": "path",
            "name": "receiptId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableCommandReceiptView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check whether an earlier edit finished",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.command-receipts.get",
          "description": "Returns the receipt for one earlier command, so you can confirm it completed and see which revision it produced.",
          "doNotUseWhen": "Do not use this operation to repeat a command.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check receiptId or stop polling a receipt that has been pruned.",
              "description": "The command receipt was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with access to the Parable command.",
              "description": "The caller cannot read this receipt."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the durable command receipt and its current status.",
          "title": "Check whether an earlier edit finished",
          "useWhen": "Check whether an earlier Workspace Parable command finished.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/deliveries/{deliveryId}/actions/pull": {
      "post": {
        "description": "Brings a published Parable that was Pushed to this Workspace into the Workspace itself. Needs a person's approval, because it changes what people here see.",
        "operationId": "ParableAuthoringPullWorkspaceParableDeliveryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "deliveryId parameter",
            "in": "path",
            "name": "deliveryId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PullWorkspaceParableDeliveryInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PullWorkspaceParableDeliveryResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Pull in a Push from somewhere else",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.deliveries.pull",
          "description": "Brings a published Parable that was Pushed to this Workspace into the Workspace itself. Needs a person's approval, because it changes what people here see.",
          "doNotUseWhen": "Do not use this operation to publish directly or retry a failed delivery.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the deliveryId and Workspace context.",
              "description": "The Delivery or target Parable was not found."
            },
            {
              "code": "PA-AU-012",
              "commonCorrection": "Finish or resolve the existing review before pulling again.",
              "description": "The Delivery already has an open review."
            },
            {
              "code": "PA-AU-013",
              "commonCorrection": "Use a current eligible Delivery.",
              "description": "The Delivery is terminal and cannot be pulled."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required RACI role.",
              "description": "The caller cannot pull this Delivery."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the pulled Change set, Delivery state, and command receipt.",
          "title": "Pull in a Push from somewhere else",
          "useWhen": "Pull an eligible published Change into the current Workspace Parable for review.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/deliveries/{deliveryId}/actions/retry": {
      "post": {
        "description": "Sends a failed Push to its destination again, using what was published at the time.",
        "operationId": "ParableAuthoringRetryWorkspaceParableDeliveryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "deliveryId parameter",
            "in": "path",
            "name": "deliveryId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetryWorkspaceParableDeliveryInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RetryWorkspaceParableDeliveryResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Retry a Push that failed",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.deliveries.retry",
          "description": "Sends a failed Push to its destination again, using what was published at the time.",
          "doNotUseWhen": "Do not use this operation for a Delivery already under review or in a terminal state.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the deliveryId and Workspace context.",
              "description": "The Delivery was not found."
            },
            {
              "code": "PA-AU-012",
              "commonCorrection": "Finish or resolve the existing review before retrying.",
              "description": "The Delivery already has an open review."
            },
            {
              "code": "PA-AU-013",
              "commonCorrection": "Use a current failed Delivery.",
              "description": "The Delivery is terminal and cannot be retried."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required RACI role.",
              "description": "The caller cannot retry this Delivery."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the retried Delivery, optional Change set, and command receipt.",
          "title": "Retry a Push that failed",
          "useWhen": "Retry a failed Workspace Parable Delivery.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/independent": {
      "post": {
        "description": "Creates a brand-new Parable in this Workspace that does not come from any other one. Needs a person's approval, because it adds something the whole Workspace can see.",
        "operationId": "ParableAuthoringCreateIndependentParableHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateIndependentParableInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CreateIndependentParableResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Create a new standalone Parable",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.primaries.create",
          "description": "Creates a brand-new Parable in this Workspace that does not come from any other one. Needs a person's approval, because it adds something the whole Workspace can see.",
          "doNotUseWhen": "Do not use this operation to create a Change set on an existing Parable.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call this operation from a Workspace URL or provide the Workspace context.",
              "description": "No Workspace context was supplied."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-029",
              "commonCorrection": "Choose a different handle.",
              "description": "Another Admin Parable already uses the requested handle."
            },
            {
              "code": "PA-AU-024",
              "commonCorrection": "Choose a different handle.",
              "description": "A Workspace Parable already uses the requested handle."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission.",
              "description": "The caller cannot create a Parable in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Creates the Parable and returns its command receipt and status.",
          "title": "Create a new standalone Parable",
          "useWhen": "Create a new standalone Parable owned by the current Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}": {
      "get": {
        "description": "Returns a Parable's name, where its content stands right now, and what can be done to it — whether it can be edited, submitted, or published.",
        "operationId": "ParableAuthoringWorkspaceParablePrimaryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePrimaryView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check a Parable's state",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.primaries.get",
          "description": "Returns a Parable's name, where its content stands right now, and what can be done to it — whether it can be edited, submitted, or published.",
          "doNotUseWhen": "Do not use this operation to read Piece contents or change the Parable.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view this Parable."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Parable identity, revisions, authoring mode, availability, and allowed actions.",
          "title": "Check a Parable's state",
          "useWhen": "Check a Workspace Parable before editing or publishing it.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/apply-archive-import": {
      "post": {
        "description": "Applies a previously planned archive to the active Primary or the caller's selected Proposal under a revision check.",
        "operationId": "ParableAuthoringApplyWorkspaceParableArchiveImportHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "proposalId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "data": {
                    "description": "JSON string containing the ApplyWorkspaceParableArchiveImportInput fields (excluding file fields)",
                    "format": "json",
                    "type": "string"
                  },
                  "file": {
                    "description": "file file upload, max size: 67108864 bytes",
                    "format": "binary",
                    "type": "string"
                  }
                },
                "required": [
                  "data",
                  "file"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ApplyWorkspaceParableArchiveImportResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Apply a Workspace Parable archive upload",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.archives.apply",
          "description": "Applies a previously planned archive to the active Primary or the caller's selected Proposal under a revision check.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedVersion"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "title": "Apply a Workspace Parable archive upload",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/apply-lab-package-edit": {
      "post": {
        "description": "Applies a Lab package edit that plan_lab_package_edit planned. Send the same files, the base version as expectedVersion, and the plan digest. Apply plans the edit again under the Parable lock and refuses it when the Lab or the plan changed: plan the edit again and retry. In a Personal Parable the edit saves directly. In Publishing, pass the proposalId of your own open Changes. Needs the Parable manage permission, the Lab package view and modify permissions, and a seat that edits Pieces.",
        "operationId": "ParableAuthoringApplyWorkspaceLabPackageEditHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "proposalId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyLabPackageEditInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ApplyWorkspaceParableArchiveImportResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Apply a Lab package edit",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.labs.packages.apply-edit",
          "description": "Applies a Lab package edit that plan_lab_package_edit planned. Send the same files, the base version as expectedVersion, and the plan digest. Apply plans the edit again under the Parable lock and refuses it when the Lab or the plan changed: plan the edit again and retry. In a Personal Parable the edit saves directly. In Publishing, pass the proposalId of your own open Changes. Needs the Parable manage permission, the Lab package view and modify permissions, and a seat that edits Pieces.",
          "doNotUseWhen": "Do not use this operation before you plan the same edit. Do not change the files between the plan and the apply.",
          "errors": [
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission, the Lab package view and modify permissions, and a seat that edits Pieces.",
              "description": "The caller cannot change this Lab package."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedVersion"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Saves the edited Lab package and returns the resulting version.",
          "title": "Apply a Lab package edit",
          "useWhen": "Apply a Lab package edit that plan_lab_package_edit planned, after its plan shows the changes you want.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/archive": {
      "post": {
        "description": "Puts a Parable away without deleting it. Its contents, Versions and history are kept, and it can be taken back out at any time.",
        "operationId": "ParableAuthoringArchiveWorkspaceParablePrimaryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParablePrimaryCommandInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePrimaryCommandResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Pocket a Parable",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.primaries.pocket",
          "description": "Puts a Parable away without deleting it. Its contents, Versions and history are kept, and it can be taken back out at any time.",
          "doNotUseWhen": "Do not use this operation to pocket a Change set; use the Change action instead.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current status and retry with the latest revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read current status and choose the supported action.",
              "description": "The Parable cannot be pocketed from its current state."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required responsible role.",
              "description": "The caller cannot pocket this Parable."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Parable in Pocketed state and its command receipt.",
          "title": "Pocket a Parable",
          "useWhen": "Put a Workspace Parable away without deleting its contents, Versions, or history.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/deploy": {
      "post": {
        "description": "Deploys an already published Version to the Workspaces you choose without publishing another Version. It needs a person's approval because it changes who can receive the Parable.",
        "operationId": "ParableAuthoringDeployParableRolloutHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeployParableRolloutInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DeployParableRolloutResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Deploy a Parable Version",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.deployments.deploy",
          "description": "Deploys an already published Version to the Workspaces you choose without publishing another Version. It needs a person's approval because it changes who can receive the Parable.",
          "doNotUseWhen": "Do not use this operation to publish new Changes or to deploy a Version that is not published.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and expectedCommitId.",
              "description": "The source Parable line or Version was not found."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Use a published, non-retracted Version.",
              "description": "The selected Version is not deployable in its current state."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key for this request.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-016",
              "commonCorrection": "Choose Workspaces you are permitted to publish into for the target mode.",
              "description": "The selected deployment targets are invalid, or include a Workspace this actor may not publish into."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Hold Responsible on the source Parable line.",
              "description": "The caller cannot deploy this Version."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Creates a Rollout and returns its Version, recipients, and delivery count.",
          "title": "Deploy a Parable Version",
          "useWhen": "Deploy an already published Version to selected Workspaces without publishing again.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/edit-piece-source": {
      "post": {
        "description": "Replaces exact passages of one document of a Piece (a Page's, Pane's or Plot's code, or a Palette) and saves the result into the given Changes, or into the Parable's own draft when proposalId is null. A Parable in Publishing mode needs proposalId. Inside a Ponder turn, those Changes must belong to the current Problem or to a Problem under it. Each edit's oldText must occur exactly once in the text as the edits before it leave it. The edit is refused when the document is no longer the revision you read, so it never lands on text you have not seen; changes to other documents since then do not block it. Returns the new revision and every diagnostic for the Piece after the save, each with its line and column.",
        "operationId": "ParableAuthoringEditParablePieceSourceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EditParablePieceSourceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/EditParablePieceSourceResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Edit part of a Piece's source",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.pieces.source.edit",
          "description": "Replaces exact passages of one document of a Piece (a Page's, Pane's or Plot's code, or a Palette) and saves the result into the given Changes, or into the Parable's own draft when proposalId is null. A Parable in Publishing mode needs proposalId. Inside a Ponder turn, those Changes must belong to the current Problem or to a Problem under it. Each edit's oldText must occur exactly once in the text as the edits before it leave it. The edit is refused when the document is no longer the revision you read, so it never lands on text you have not seen; changes to other documents since then do not block it. Returns the new revision and every diagnostic for the Piece after the save, each with its line and column.",
          "doNotUseWhen": "Do not use this operation to create, rename, move or delete a Piece, or to change a Perception or Policies; use edit_pieces for those.",
          "errors": [
            {
              "code": "PA-AU-002",
              "commonCorrection": "Call read_piece_problems again and make the edit against its current text and revision.",
              "description": "The document changed after you read it."
            },
            {
              "code": "PA-AU-045",
              "commonCorrection": "Include more surrounding text so oldText occurs exactly once, or read the current text first.",
              "description": "An edit's oldText does not occur exactly once in the document."
            },
            {
              "code": "PA-AU-035",
              "commonCorrection": "Use only declared Panes and supported Parable modules; the details give the line and column.",
              "description": "The edited source imports an unavailable module, or a Pane its Perception does not declare."
            },
            {
              "code": "PA-AU-038",
              "commonCorrection": "Use a handle the Piece declares, or declare it first.",
              "description": "The edited source references a handle that is not declared."
            },
            {
              "code": "PA-AU-041",
              "commonCorrection": "Correct the SQL using the details.",
              "description": "The edited Plot SQL could not be planned."
            },
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId, proposalId, pieceKey and document.",
              "description": "The Parable, Changes, Piece or document was not found."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Pass the proposalId of the current Problem's Changes. If it has none, call start_proposing_changes first. In the root Problem, first start a Problem under it. From a Problem about another Parable, start a Problem under this Parable's root Problem, and continue there.",
              "description": "The Parable takes edits through Changes, and proposalId is null. Inside a Ponder turn, these Changes can also belong to no Problem, or to a Problem that is neither the current Problem nor under it. Or the current Problem is about another Parable."
            },
            {
              "code": "PA-AU-026",
              "commonCorrection": "Ask their author to make the edit. Or start a Problem under the Problem that holds them, and edit that Problem's Changes.",
              "description": "The caller did not author these Changes."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required authoring role.",
              "description": "The caller cannot edit this Parable."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRefVersion"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Saves the edited document and returns its new revision with the Piece's diagnostics after the save: lint, TypeScript, the compile and Plot SQL validation.",
          "title": "Edit part of a Piece's source",
          "useWhen": "Fix a problem read_piece_problems reported, or make any small change to a Page's, Pane's or Plot's code or a Palette, by replacing exact passages.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/edit-pieces": {
      "post": {
        "description": "Creates or edits a Package, Page, Pane, Plot or Palette; a Page's or Pane's Perception and Policies are fields of the Page or Pane. Saves a sparse Piece package into the open Changes named by proposalId, where nobody sees it until they are published, or, with proposalId null, straight onto the Parable in Personal mode, which also needs expectedAggregateRevision. Inside a Ponder turn, the Changes must belong to the current Problem or to a Problem under it. Read the current revision and sibling order first, give each new Piece its identity and icon fields, and give every Page, Package, Pane and Plot the save writes a one-sentence description.",
        "operationId": "ParableAuthoringEditParablePiecesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EditParablePiecesInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/EditParablePiecesResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Edit Pieces",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.pieces.edit",
          "description": "Creates or edits a Package, Page, Pane, Plot or Palette; a Page's or Pane's Perception and Policies are fields of the Page or Pane. Saves a sparse Piece package into the open Changes named by proposalId, where nobody sees it until they are published, or, with proposalId null, straight onto the Parable in Personal mode, which also needs expectedAggregateRevision. Inside a Ponder turn, the Changes must belong to the current Problem or to a Problem under it. Read the current revision and sibling order first, give each new Piece its identity and icon fields, and give every Page, Package, Pane and Plot the save writes a one-sentence description.",
          "doNotUseWhen": "Do not use this operation to change a Parable's name or how it is labelled, or to publish Changes.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId, the proposalId and the Workspace context.",
              "description": "The Parable or the Change set was not found in the current Workspace."
            },
            {
              "code": "PA-AU-002",
              "commonCorrection": "Read the current package and retry with its latest ref version.",
              "description": "The Piece source revision is stale."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current status and retry with the latest aggregate revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-004",
              "commonCorrection": "Reopen the Change set before editing it, or take it out of the Pocket. Otherwise start a Problem under the current Problem for your change.",
              "description": "The Change set source is sealed. In Publishing mode with a null proposalId inside a Ponder turn, the current Problem's Changes are proposed, published, closed or in the Pocket."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "On a Personal Parable, pass a null proposalId. Inside a Ponder turn, edit the current Problem's own Changes, or start them with start_proposing_changes. In the root, start a Problem under it with start_problem, then edit that Problem's Changes. Take a Pocketed Problem out of the Pocket first. From a Problem about another Parable, start a Problem under this Parable's root Problem, and continue there.",
              "description": "The Parable is in Personal mode while proposalId names Changes, or the Changes review a pulled Delivery that is no longer in review. Inside a Ponder turn, a proposalId must name Changes of the current Problem or of a Problem under it. In Publishing mode with a null proposalId, the current Problem cannot be the Parable's root, in the Pocket, or about another Parable."
            },
            {
              "code": "PA-AU-035",
              "commonCorrection": "Use only declared Piece handles and supported Parable modules.",
              "description": "Piece source imports an unavailable module."
            },
            {
              "code": "PA-AU-036",
              "commonCorrection": "Reduce the submitted source before retrying.",
              "description": "Piece source exceeds its size limit."
            },
            {
              "code": "PA-AU-037",
              "commonCorrection": "Read current Pieces and choose an unused handle.",
              "description": "Another Piece already uses the requested handle."
            },
            {
              "code": "PA-AU-038",
              "commonCorrection": "Declare the referenced Piece in the same save or correct the handle.",
              "description": "Piece source references a handle that is not declared."
            },
            {
              "code": "PA-AU-039",
              "commonCorrection": "Correct the returned path; author Perception source and let the server generate its manifest.",
              "description": "The Piece definition or manifest is invalid."
            },
            {
              "code": "PA-AU-040",
              "commonCorrection": "Correct the Preference value or its source contract.",
              "description": "A Preference does not conform to its declared contract."
            },
            {
              "code": "PA-AU-041",
              "commonCorrection": "Correct the Plot SQL using the planner details.",
              "description": "Plot SQL could not be planned."
            },
            {
              "code": "PA-AU-046",
              "commonCorrection": "Give each Piece the details list a one-sentence description of what it is for.",
              "description": "A Page, Package, Pane or Plot the save writes has no description."
            },
            {
              "code": "PA-AU-026",
              "commonCorrection": "Ask their author to make the edit. Or start a Problem under the Problem that holds them, and edit that Problem's Changes.",
              "description": "Someone else authored these Changes, and only their author edits them. In Publishing mode with a null proposalId inside a Ponder turn, these are the current Problem's Changes."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required RACI role.",
              "description": "The caller cannot edit this Parable."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRefVersion"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Saves the sparse Piece package and returns what was saved: personal or publishing.",
          "title": "Edit Pieces",
          "useWhen": "Create or edit a Package, Page, Pane, Plot or Palette of a Parable, in Personal or Publishing mode.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/export-archive": {
      "get": {
        "description": "Packages a Parable into a single archive file you can keep or move elsewhere, using either its published contents or a set of Changes you have open.",
        "operationId": "ParableAuthoringExportWorkspaceParableArchiveHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "proposalId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "string"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Download a Parable as a file",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.archives.export",
          "description": "Packages a Parable into a single archive file you can keep or move elsewhere, using either its published contents or a set of Changes you have open.",
          "doNotUseWhen": "Do not use this operation to import an archive or change the Parable.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and proposalId.",
              "description": "The Parable or selected Changes were not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot export this Parable."
            },
            {
              "code": "PA-AU-009",
              "commonCorrection": "Refresh the current package and retry after correcting invalid content.",
              "description": "The archive could not be produced from the selected content."
            },
            {
              "code": "PA-AU-043",
              "commonCorrection": "Import an app into the Lab, then export it.",
              "description": "The Parable is a Lab with no app imported yet, so there is nothing to export."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the encoded Parable archive.",
          "title": "Download a Parable as a file",
          "useWhen": "Download a Workspace Parable as an archive, using published content or your selected Changes.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/identity": {
      "post": {
        "description": "Updates a Personal Parable's name, handle, mark and description. Send only fields being changed: name and handle cannot be null; omit handle to have it follow the name. In Publishing mode, read the current Changes package and use edit_pieces to update its Parable Details title and Home Page name instead. Do not publish unless asked. Other content stays unchanged.",
        "operationId": "ParableAuthoringSetWorkspaceParableIdentityHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetWorkspaceParableIdentityInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SetWorkspaceParableIdentityResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Rename a Parable or change how it is labelled",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.identities.update",
          "description": "Updates a Personal Parable's name, handle, mark and description. Send only fields being changed: name and handle cannot be null; omit handle to have it follow the name. In Publishing mode, read the current Changes package and use edit_pieces to update its Parable Details title and Home Page name instead. Do not publish unless asked. Other content stays unchanged.",
          "doNotUseWhen": "Do not use this operation for a shared Parable in Publishing mode; edit its Changes instead.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Use Personal mode or edit the shared Parable through Changes.",
              "description": "The Parable identity cannot be changed in its current lifecycle."
            },
            {
              "code": "PA-AU-024",
              "commonCorrection": "Choose a different handle.",
              "description": "Another Workspace Parable already uses the requested handle."
            },
            {
              "code": "PA-AU-030",
              "commonCorrection": "Choose an available catalog address.",
              "description": "The requested catalog address is already taken."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required responsible role.",
              "description": "The caller cannot change this Parable identity."
            },
            {
              "code": "PA-AU-053",
              "commonCorrection": "Correct the preview to a 1280 x 608 SVG drawn only with basic shapes, paths, groups, patterns and styles, then send it again.",
              "description": "The preview is not a Parable plate. The message and details.rule name the rule it broke."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the Workspace Parable with its updated identity fields.",
          "title": "Rename a Parable or change how it is labelled",
          "useWhen": "Update the name, handle, mark, or description of a Personal Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/plan-archive-import": {
      "post": {
        "description": "Validates an archive against the active Primary or the caller's selected Proposal without changing it.",
        "operationId": "ParableAuthoringPlanWorkspaceParableArchiveImportHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "proposalId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "data": {
                    "description": "JSON string containing the PlanWorkspaceParableArchiveImportInput fields (excluding file fields)",
                    "format": "json",
                    "type": "string"
                  },
                  "file": {
                    "description": "file file upload, max size: 67108864 bytes",
                    "format": "binary",
                    "type": "string"
                  }
                },
                "required": [
                  "data",
                  "file"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceParableArchiveImportPlan"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Plan a Workspace Parable archive upload",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.archives.plan",
          "description": "Validates an archive against the active Primary or the caller's selected Proposal without changing it.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Plan a Workspace Parable archive upload",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/plan-lab-package-edit": {
      "post": {
        "description": "Plans an edit to a Lab package without changing it. The edit sets or deletes text files by package path: send the whole new text of each file, or null to delete it. plots replaces the Plot declarations of parable.lab.json, each a slug, a name, and the path of its .sql file. Null plots keeps them. The plan reads the Lab's current files, applies the edits, and runs the planner that a ZIP import runs. It returns the changes, the diagnostics, and the warnings, with the base version and the plan digest that apply needs. A warning names a file and line where the app sends SQL to a pool. A reader with a Peeking seat gets a refusal there. To resolve it, move that SQL into a declared Plot and read the Plot, then plan again. With proposalId it plans onto your own open Changes. Needs the Parable manage permission and the Lab package view and modify permissions. Apply also needs a seat that edits Pieces.",
        "operationId": "ParableAuthoringPlanWorkspaceLabPackageEditHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "proposalId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlanLabPackageEditInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceParableArchiveImportPlan"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Plan a Lab package edit",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.labs.packages.plan-edit",
          "description": "Plans an edit to a Lab package without changing it. The edit sets or deletes text files by package path: send the whole new text of each file, or null to delete it. plots replaces the Plot declarations of parable.lab.json, each a slug, a name, and the path of its .sql file. Null plots keeps them. The plan reads the Lab's current files, applies the edits, and runs the planner that a ZIP import runs. It returns the changes, the diagnostics, and the warnings, with the base version and the plan digest that apply needs. A warning names a file and line where the app sends SQL to a pool. A reader with a Peeking seat gets a refusal there. To resolve it, move that SQL into a declared Plot and read the Plot, then plan again. With proposalId it plans onto your own open Changes. Needs the Parable manage permission and the Lab package view and modify permissions. Apply also needs a seat that edits Pieces.",
          "doNotUseWhen": "Do not use this operation on a structured Parable, or to add an image or another binary file. Use edit_pieces for a structured Parable, and a ZIP import for binary files.",
          "errors": [
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission, the Lab package view and modify permissions, and a seat that edits Pieces.",
              "description": "The caller cannot change this Lab package."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the plan: its changes, its diagnostics, its warnings, the base version and the plan digest. Nothing changes.",
          "title": "Plan a Lab package edit",
          "useWhen": "Change a Lab's app files or its Plot SQL files, or resolve the warnings of a Lab package plan.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/plot": {
      "post": {
        "description": "Starts a Report reading against a Parable using the data source you choose. The result shows up as a Report run. With preview, the run reads a sample of the data and can run on a set of Changes; prefer a Preview while you iterate and a full run once the Changes are published.",
        "operationId": "ParableAuthoringPlotWorkspaceParableReportHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlotParableReportInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableReportRunView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Run a Report on a Parable",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.reports.plot",
          "description": "Starts a Report reading against a Parable using the data source you choose. The result shows up as a Report run. With preview, the run reads a sample of the data and can run on a set of Changes; prefer a Preview while you iterate and a full run once the Changes are published.",
          "doNotUseWhen": "Do not use this operation to inspect Report context or preview a recurrence.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and confirm a published Version exists; for a Preview, check the proposalId.",
              "description": "The Parable or its published Report context was not found, or the set of Changes to Preview is not one the caller may open on this Parable."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-007",
              "commonCorrection": "Restore the Parable, then run its Report.",
              "description": "The Parable is pocketed, so it cannot run a Report."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required RACI role.",
              "description": "The caller cannot run a Report for this Parable."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Name one enabled Report, or publish a Report whose Plots require a Report run.",
              "description": "The published version has no enabled Report to run, or no Plot that needs a Report run."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Creates a Report run with provider snapshots and pending Plot results. A Preview is the same run on a sample: one in ten rows of each Provider table over 10,000 rows, the same rows every time, smaller tables whole. It is listed with the Refreshes but never becomes Latest.",
          "title": "Run a Report on a Parable",
          "useWhen": "Start a Report reading for a Workspace Parable using its available data sources, or, with preview, check the whole Report end to end on a sample of the data, on the newest Version or on a set of Changes before it is published.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/restore": {
      "post": {
        "description": "Brings a pocketed Parable back into normal use, exactly as it was.",
        "operationId": "ParableAuthoringRestoreWorkspaceParablePrimaryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParablePrimaryCommandInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePrimaryCommandResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Take a Parable out of the Pocket",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.primaries.restore",
          "description": "Brings a pocketed Parable back into normal use, exactly as it was.",
          "doNotUseWhen": "Do not use this operation for an active Parable or a pocketed Change set.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current status and retry with the latest revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read current status and choose the supported action.",
              "description": "The Parable is not pocketed and cannot be restored."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required responsible role.",
              "description": "The caller cannot restore this Parable."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the restored Parable and command receipt.",
          "title": "Take a Parable out of the Pocket",
          "useWhen": "Restore a pocketed Workspace Parable to normal use.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/retract": {
      "post": {
        "description": "Prevents new Workspaces from receiving one published Version without changing existing deployments. It needs a person's approval because it withdraws future reach.",
        "operationId": "ParableAuthoringRetractParableCommitHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetractParableCommitInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RetractParableCommitResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Retract a Parable Version",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.versions.retract",
          "description": "Prevents new Workspaces from receiving one published Version without changing existing deployments. It needs a person's approval because it withdraws future reach.",
          "doNotUseWhen": "Do not use this operation to remove an already deployed Version from existing Workspaces.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and commitId.",
              "description": "The source Parable line or commit was not found."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read Version and Rollout state before retrying.",
              "description": "The Version cannot be retracted from its current state."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key for this request.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Hold Responsible on the source Parable line.",
              "description": "The caller cannot retract this Version."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the retracted Version and affected deployment counts.",
          "title": "Retract a Parable Version",
          "useWhen": "Prevent new Workspaces from receiving one published Version.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/revalidate": {
      "post": {
        "description": "Retries unchecked or stale Plot SQL validation on the Parable line with one shared ten-second budget across both passes. Current completed verdicts, including SQL errors, are skipped. Records diagnostics and last-good output schemas without changing authored content. Requires the Parable manage permission. Repeating the request with the same idempotency key returns the recorded receipt without rerunning validation.",
        "operationId": "ParableAuthoringRevalidateWorkspaceParablePrimaryPlotsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RevalidateParablePlotsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RevalidateParablePlotsResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Revalidate Plot SQL",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parables.authoring.revalidate-plots",
          "description": "Retries unchecked or stale Plot SQL validation on the Parable line with one shared ten-second budget across both passes. Current completed verdicts, including SQL errors, are skipped. Records diagnostics and last-good output schemas without changing authored content. Requires the Parable manage permission. Repeating the request with the same idempotency key returns the recorded receipt without rerunning validation.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Revalidate Plot SQL",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/revoke": {
      "post": {
        "description": "Withdraws a Parable from Workspaces that currently hold it, narrowing its audience without changing its timeline. It needs a person's approval because it takes something away.",
        "operationId": "ParableAuthoringRevokeParableDeploymentHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RevokeParableDeploymentInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RevokeParableDeploymentResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Revoke a Parable deployment",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.deployments.revoke",
          "description": "Withdraws a Parable from Workspaces that currently hold it, narrowing its audience without changing its timeline. It needs a person's approval because it takes something away.",
          "doNotUseWhen": "Do not use this operation to block a single Version from new receivers; retract does that.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId.",
              "description": "The source Parable line was not found."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read the Parable's current Rollout before retrying.",
              "description": "The Parable is not published to any Workspace, or its current Rollout is not expectedRolloutId."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Hold Responsible on the source Parable line.",
              "description": "The caller cannot revoke this deployment."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the revoked deployment and the Workspaces affected.",
          "title": "Revoke a Parable deployment",
          "useWhen": "Withdraw a Parable from Workspaces that currently receive it.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/save": {
      "post": {
        "description": "Create or edit a Package, Page, Pane, Plot, or Palette in Personal mode; a Page's or Pane's Perception and Policies are fields of the Page or Pane. Saves a sparse Piece package straight onto the Parable, with no separate Process or review step. Read current revisions and sibling order first; root Packages and Pages share sibling positions. Supply each new Piece's required identity and icon fields, and give every Page, Package, Pane and Plot the save writes a one-sentence description. In Personal mode the change is live at once for anyone who can see the Parable. In Publishing mode the save goes into a set of Changes instead. Inside a Ponder turn, that is the current Problem's own Pending set, or a new set for a Problem that holds none. Outside a turn, it is your newest Pending set, or a new set that no Problem holds.",
        "operationId": "ParableAuthoringSaveWorkspaceParablePrimaryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveParablePrimaryInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SaveParablePrimaryResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Edit a Piece (Personal mode)",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.primary-drafts.save",
          "description": "Create or edit a Package, Page, Pane, Plot, or Palette in Personal mode; a Page's or Pane's Perception and Policies are fields of the Page or Pane. Saves a sparse Piece package straight onto the Parable, with no separate Process or review step. Read current revisions and sibling order first; root Packages and Pages share sibling positions. Supply each new Piece's required identity and icon fields, and give every Page, Package, Pane and Plot the save writes a one-sentence description. In Personal mode the change is live at once for anyone who can see the Parable. In Publishing mode the save goes into a set of Changes instead. Inside a Ponder turn, that is the current Problem's own Pending set, or a new set for a Problem that holds none. Outside a turn, it is your newest Pending set, or a new set that no Problem holds.",
          "doNotUseWhen": "Do not use this operation to edit a set of Changes by its proposalId, or to author a Perception manifest. The server generates Perception manifests from source.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-002",
              "commonCorrection": "Read the current package and retry with its latest ref version.",
              "description": "The Piece source revision is stale."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current status and retry with the latest aggregate revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-035",
              "commonCorrection": "Use only declared Piece handles and supported Parable modules.",
              "description": "Piece source imports an unavailable module."
            },
            {
              "code": "PA-AU-036",
              "commonCorrection": "Reduce the submitted source before retrying.",
              "description": "Piece source exceeds its size limit."
            },
            {
              "code": "PA-AU-037",
              "commonCorrection": "Read current Pieces and choose an unused handle.",
              "description": "Another Piece already uses the requested handle."
            },
            {
              "code": "PA-AU-038",
              "commonCorrection": "Declare the referenced Piece in the same save or correct the handle.",
              "description": "Piece source references a handle that is not declared."
            },
            {
              "code": "PA-AU-039",
              "commonCorrection": "Correct the returned path; author Perception source and let the server generate its manifest.",
              "description": "The Piece definition or manifest is invalid."
            },
            {
              "code": "PA-AU-040",
              "commonCorrection": "Correct the Preference value or its source contract.",
              "description": "A Preference does not conform to its declared contract."
            },
            {
              "code": "PA-AU-041",
              "commonCorrection": "Correct the Plot SQL using the planner details.",
              "description": "Plot SQL could not be planned."
            },
            {
              "code": "PA-AU-046",
              "commonCorrection": "Give each Piece the details list a one-sentence description of what it is for.",
              "description": "A Page, Package, Pane or Plot the save writes has no description."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "In the root, start a Problem under it with start_problem, then edit that Problem's Changes. Take a Pocketed Problem out of the Pocket first. From a Problem about another Parable, start a Problem under this Parable's root Problem, and continue there.",
              "description": "In Publishing mode, inside a Ponder turn: the current Problem is the Parable's root Problem, which holds no Changes. Or it is in the Pocket, or it is about another Parable."
            },
            {
              "code": "PA-AU-026",
              "commonCorrection": "Start a Problem under it for your change.",
              "description": "In Publishing mode, inside a Ponder turn: the current Problem's Changes belong to someone else."
            },
            {
              "code": "PA-AU-004",
              "commonCorrection": "Reopen your proposed Changes, or take them out of the Pocket. Otherwise start a Problem under it for your change.",
              "description": "In Publishing mode, inside a Ponder turn: the current Problem's Changes are proposed, published, closed or in the Pocket."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required RACI role.",
              "description": "The caller cannot edit this Parable."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRefVersion",
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Saves the sparse Piece package and returns current Parable and package state.",
          "title": "Edit a Piece (Personal mode)",
          "useWhen": "Create or edit a Piece directly on a Workspace Parable in Personal mode.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/set-built-by-parable-pros": {
      "post": {
        "description": "Sets whether Parable Pros built a Parable owned by this Workspace and returns the resulting attribution. Requires Pros view and modify permissions, Parable manage, and responsibility to edit the identity. A delivered copy cannot change the attribution of its upstream Parable. Does not publish a Version.",
        "operationId": "ParableAuthoringSetWorkspaceParableBuiltByParableProsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetProductParableBuiltByParableProsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set Workspace Parable Pros attribution",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.identity.pros",
          "description": "Sets whether Parable Pros built a Parable owned by this Workspace and returns the resulting attribution. Requires Pros view and modify permissions, Parable manage, and responsibility to edit the identity. A delivered copy cannot change the attribution of its upstream Parable. Does not publish a Version.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Set Workspace Parable Pros attribution",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/actions/set-platform-parable": {
      "post": {
        "description": "Turns a Parable's Platform switch on or off. A Platform Parable is deployed to every Workspace, including Workspaces created later, and only a Platform Parable can be read by other Parables' Plots. Turning it on deploys the named published Version to every Workspace. Visible stays the only per-Workspace control. Turning it off is refused while other Parables' published Versions read it. Off keeps every copy already delivered and lets later Deploys choose their Workspaces again.",
        "operationId": "ParableAuthoringSetPlatformParableHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPlatformParableInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SetPlatformParableResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Make a Parable a Platform Parable",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "admin",
          "capability": "parable.identity.platform",
          "description": "Turns a Parable's Platform switch on or off. A Platform Parable is deployed to every Workspace, including Workspaces created later, and only a Platform Parable can be read by other Parables' Plots. Turning it on deploys the named published Version to every Workspace. Visible stays the only per-Workspace control. Turning it off is refused while other Parables' published Versions read it. Off keeps every copy already delivered and lets later Deploys choose their Workspaces again.",
          "doNotUseWhen": "Do not use this operation to choose where people see a Parable; that is Visible. Do not use it to deploy a Version of a Parable that is already a Platform Parable; Deploy does that.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and expectedCommitId.",
              "description": "The Parable or the named Version was not found on its source line."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use an identity with Parable staff permission and Responsible on the Parable.",
              "description": "The caller cannot change the Platform switch."
            },
            {
              "code": "PA-AU-054",
              "commonCorrection": "Publish each Parable that details.readers names without its reads of this Parable, then turn the switch off.",
              "description": "Other Parables' published Versions read this Parable, so it stays a Platform Parable. details.readers names them."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the switch, the Rollout that deployed the Version when turning it on deployed one, and the Parables that read this one.",
          "title": "Make a Parable a Platform Parable",
          "useWhen": "Make a Parable available to every Workspace and to other Parables, or take that back.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/data/catalog-snapshot": {
      "get": {
        "description": "Returns the catalog snapshot the Plot editor validates SQL against for a Parable line: the Workspace's provider tables and views, plus the line's sibling Plots with their derived columns. Requires the data catalog permission in addition to Parable read access; a reader without it receives a 403 with error code PA-AU-031. The response carries a weak ETag, and a request with a matching If-None-Match returns 304.",
        "operationId": "ParableAuthoringWorkspaceParableCatalogSnapshotHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CatalogSnapshot"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Get the catalog snapshot",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parables.authoring.catalog-snapshot",
          "description": "Returns the catalog snapshot the Plot editor validates SQL against for a Parable line: the Workspace's provider tables and views, plus the line's sibling Plots with their derived columns. Requires the data catalog permission in addition to Parable read access; a reader without it receives a 403 with error code PA-AU-031. The response carries a weak ETag, and a request with a matching If-None-Match returns 304.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Get the catalog snapshot",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/package": {
      "get": {
        "description": "Returns everything inside a Parable as it currently stands — its Pages, Panes, Plots, Palettes and Policies, already assembled.",
        "operationId": "ParableAuthoringWorkspaceParablePrimaryPackageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableEffectivePackageRead"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Parable's contents",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.primary-packages.get",
          "description": "Returns everything inside a Parable as it currently stands — its Pages, Panes, Plots, Palettes and Policies, already assembled.",
          "doNotUseWhen": "Do not use this operation to inspect status only or to modify content.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view this Parable contents."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the effective package with Piece definitions and source implementations.",
          "title": "Read a Parable's contents",
          "useWhen": "Read the assembled contents of a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/panes/resolve": {
      "post": {
        "description": "Works out what a set of Panes should show, using this Workspace, its Parable and the Policies in force. Returns what each Pane is allowed to do without needing to read the protected source behind it.",
        "operationId": "ParableAuthoringResolveParablePanesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParablePaneResolveBatchInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePaneResolveBatchResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Resolve a batch of Panes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.panes.resolve",
          "description": "Works out what a set of Panes should show, using this Workspace, its Parable and the Policies in force. Returns what each Pane is allowed to do without needing to read the protected source behind it.",
          "doNotUseWhen": "Do not use this operation to edit Pane definitions or run Plot data.",
          "errors": [
            {
              "code": "PA-AU-040",
              "commonCorrection": "Send a valid Pane selection and refresh the definition context.",
              "description": "The Pane resolution input is not conforming."
            },
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and selected ref or Version.",
              "description": "The Parable or selected definition was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot inspect this Parable."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the resolved Pane batch for the selected definition context.",
          "title": "Resolve a batch of Panes",
          "useWhen": "Resolve a batch of Panes from a Workspace Parable definition.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/piece-diagnostics": {
      "get": {
        "description": "Returns one Piece's documents (a Page's, Pane's or Plot's code and its Palette), and a Page's or Pane's Perception source and Policies, from the given Changes, or from the Parable's own content when proposalId is null. Each document carries its text, its revision and every current diagnostic for exactly that text: lint, TypeScript type errors, compile errors and Plot SQL validation, each with its line, column, offsets and excerpt. Lint and TypeScript run in the background; pending is true while one has not answered, and a second read shortly after carries it.",
        "operationId": "ParableAuthoringReadParablePieceDiagnosticsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "pieceKey",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "proposalId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePieceDiagnostics"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Piece's problems",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.pieces.diagnostics.get",
          "description": "Returns one Piece's documents (a Page's, Pane's or Plot's code and its Palette), and a Page's or Pane's Perception source and Policies, from the given Changes, or from the Parable's own content when proposalId is null. Each document carries its text, its revision and every current diagnostic for exactly that text: lint, TypeScript type errors, compile errors and Plot SQL validation, each with its line, column, offsets and excerpt. Lint and TypeScript run in the background; pending is true while one has not answered, and a second read shortly after carries it.",
          "doNotUseWhen": "Do not use this operation to change anything.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId, proposalId and pieceKey.",
              "description": "The Parable, Changes or Piece was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot read this Parable."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns each document of the Piece with its text, revision and every current diagnostic (lint, TypeScript, the compile and Plot SQL validation), each with its line and column, and a Page's or Pane's Perception source and Policies.",
          "title": "Read a Piece's problems",
          "useWhen": "Read one Page, Pane, Plot or Palette whole: its code, its Palette, and for a Page or Pane its Perception and Policies. Check it for problems after editing it or when it does not render, and get the exact text and revision to fix it with edit_piece_source.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/plots/data": {
      "post": {
        "description": "Returns a page of rows from a saved Plot, under the Policies in force. The server works out where the data comes from and returns it alongside the definition it was read with.",
        "operationId": "ParableAuthoringReadParablePlotDataHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlotDataCommand"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlotDataResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Plot's data",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.plots.data.read",
          "description": "Returns a page of rows from a saved Plot, under the Policies in force. The server works out where the data comes from and returns it alongside the definition it was read with.",
          "doNotUseWhen": "Do not use this operation to inspect only the Plot manifest or TypeScript types.",
          "errors": [
            {
              "code": "PA-AU-040",
              "commonCorrection": "Select one valid Plot and provide parameters that match its contract.",
              "description": "The Plot data command or parameters are not conforming."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Refresh Plot context and retry with the latest revision.",
              "description": "The Plot context or contract changed during the read."
            },
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and selected Plot or Report.",
              "description": "The Parable, Plot, or Report data was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Read the Plot without sql to get its saved rows. Running other SQL needs the right to save that Plot.",
              "description": "The command sent sql of its own, and the caller could not save that SQL as this Plot. Saving it takes tenant.parables.manage (staff: admin.parables.manage), Publishing or Primary on the Parable, and edit.plots or create.plots from the Plot's Pane Policies."
            },
            {
              "code": "QL-TO-002",
              "commonCorrection": "Narrow the Plot with a filter, a shorter date range or an aggregation, then read it again.",
              "description": "The Plot query ran past its time budget and was stopped (HTTP 504). The message names the budget."
            },
            {
              "code": "QL-IN-008",
              "commonCorrection": "Read the Plot again after a short pause.",
              "description": "Too many queries were running, so the read did not start (HTTP 429)."
            },
            {
              "code": "QL-SQ-010",
              "commonCorrection": "Call the AI function over fewer rows, or read a stored Refresh of the Plot.",
              "description": "The Plot read would send more paid AI calls (ponder, embed and the Jev functions) than one query may send, so it stopped before the next call (HTTP 400). The message names the limit and the function."
            },
            {
              "code": "QL-SQ-011",
              "commonCorrection": "Call the AI function over fewer rows or with a cheaper model, or read a stored Refresh of the Plot.",
              "description": "The Plot read's paid AI calls would cost more than one query may spend, so it stopped before the next call (HTTP 400). The message names the limit and what the read spent."
            },
            {
              "code": "QL-TN-007",
              "commonCorrection": "Do not read this Refresh again as this caller. Someone whom no Provider Policy or source permissions narrow on those tables can open it.",
              "description": "The read asked for a stored Refresh, and Provider Policies or source permissions narrow what the caller reads of a Provider table behind it. The Refresh holds rows the caller cannot read, so it is refused (HTTP 403)."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns Plot data for the selected definition and report context.",
          "title": "Read a Plot's data",
          "useWhen": "Read data returned by a Plot in a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/plots/data/manifest": {
      "get": {
        "description": "Lists the outputs a Plot produces and the columns each one is planned to have. The SQL behind it is not returned.",
        "operationId": "ParableAuthoringGetParablePlotDataManifestHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlotDataManifest"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List what a Plot will return",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.plots.data.manifest",
          "description": "Lists the outputs a Plot produces and the columns each one is planned to have. The SQL behind it is not returned.",
          "doNotUseWhen": "Do not use this operation to execute Plot data or modify the Plot.",
          "errors": [
            {
              "code": "PA-AU-040",
              "commonCorrection": "Refresh the selected definition and correct the Plot contract.",
              "description": "The Plot contract or definition is not conforming."
            },
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and selected ref or Version.",
              "description": "The Parable or Plot manifest was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot inspect this Plot."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Plot data manifest for the selected definition.",
          "title": "List what a Plot will return",
          "useWhen": "Inspect the fields and contract a Plot will return.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/plots/data/types": {
      "get": {
        "description": "Returns TypeScript declarations for a Plot's outputs, so code that reads them can be type-checked.",
        "operationId": "ParableAuthoringGetParablePlotDataTypesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePlotDataTypes"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Get TypeScript types for a Plot",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.plots.data.types",
          "description": "Returns TypeScript declarations for a Plot's outputs, so code that reads them can be type-checked.",
          "doNotUseWhen": "Do not use this operation to run the Plot or change its contract.",
          "errors": [
            {
              "code": "PA-AU-040",
              "commonCorrection": "Refresh the selected definition and correct the Plot contract.",
              "description": "The Plot contract or definition is not conforming."
            },
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and selected ref or Version.",
              "description": "The Parable or Plot manifest was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot inspect this Plot."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns TypeScript result types derived from the Plot data contract.",
          "title": "Get TypeScript types for a Plot",
          "useWhen": "Get TypeScript types for a Plot result in a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/plotted-path": {
      "post": {
        "description": "Explains, in a few plain steps, how what is shown on a Pane came to be, from the tools its information comes from up to the Pane, with links to the parts a reader may open next.",
        "operationId": "ParableAuthoringExplainParablePlottedPathHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlottedPathRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlottedPathExplanation"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Explain how an answer came to be",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parables.plotted-path.explain",
          "description": "Explains, in a few plain steps, how what is shown on a Pane came to be, from the tools its information comes from up to the Pane, with links to the parts a reader may open next.",
          "doNotUseWhen": "Do not use for a Pane's data itself; read its Plot instead.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask someone who publishes the Parable.",
              "description": "The reader may not view this Pane, or asked to write it again without publishing the Parable."
            },
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId, the Version and the paneKey.",
              "description": "The Parable, Version or Pane was not found."
            },
            {
              "code": "WA-PL-001",
              "commonCorrection": "Set OPENROUTER_API_KEY for web-api.",
              "description": "Ponder's language calls are not configured here."
            },
            {
              "code": "WA-PL-002",
              "commonCorrection": "Allow OpenRouter for Ponder's explanations and summaries.",
              "description": "The Workspace's model policy refuses Ponder's language calls."
            },
            {
              "code": "WA-PL-003",
              "commonCorrection": "Try again.",
              "description": "The model call failed."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "success": "Returns the steps, the Version they explain, and whether they are an earlier explanation shown while a new one is written.",
          "title": "Explain how an answer came to be",
          "useWhen": "Use when a reader asks how an answer on a Pane was arrived at.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/preferences": {
      "get": {
        "description": "Lists settings for this Parable: yours (Me), and the settings shared for This Parable whose Pane lets you see them. Narrow to one Pane or one handle. Each says whether it is Live or Versioned; a Versioned setting lists the values of the definition named by refId or versionId (your Changes, or a Version), else the line's current one.",
        "operationId": "ParableAuthoringListParablePreferencesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "paneKey",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "handle",
            "required": false,
            "schema": {
              "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParablePreferenceView"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Preferences",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.preferences.list",
          "description": "Lists settings for this Parable: yours (Me), and the settings shared for This Parable whose Pane lets you see them. Narrow to one Pane or one handle. Each says whether it is Live or Versioned; a Versioned setting lists the values of the definition named by refId or versionId (your Changes, or a Version), else the line's current one.",
          "doNotUseWhen": "Do not use this operation to save or delete settings.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId.",
              "description": "The Parable was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot read this Parable."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns your own settings and the shared settings you can read.",
          "title": "List Preferences",
          "useWhen": "List the settings saved for a Workspace Parable, optionally for one Pane or handle.",
          "visibility": "internal"
        }
      },
      "put": {
        "description": "Saves one setting for a Pane under a handle. expectedRevision 0 creates the setting and fails if one exists; any other revision replaces the value that revision read. A shared setting belongs to the Workspace: creating one needs the Pane's create.preferences Policy, and changing one needs edit.preferences. The Pane's Perception declares each setting Live or Versioned. A Live setting applies at once to every Version. A Versioned one changes the Parable: when the caller may publish, the save publishes a new Version through Prepare and the Plot gate, numbered by release (minor unless major); when they may change the setting but not publish, it opens a set of Changes holding only this change and proposes it; a Versioned setting has no value for one person (shared must be true). On a Personal Parable a Versioned save is saved to the Parable.",
        "operationId": "ParableAuthoringSaveParablePreferenceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveParablePreferenceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePreferenceWriteResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Save a Preference",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.preferences.save",
          "description": "Saves one setting for a Pane under a handle. expectedRevision 0 creates the setting and fails if one exists; any other revision replaces the value that revision read. A shared setting belongs to the Workspace: creating one needs the Pane's create.preferences Policy, and changing one needs edit.preferences. The Pane's Perception declares each setting Live or Versioned. A Live setting applies at once to every Version. A Versioned one changes the Parable: when the caller may publish, the save publishes a new Version through Prepare and the Plot gate, numbered by release (minor unless major); when they may change the setting but not publish, it opens a set of Changes holding only this change and proposes it; a Versioned setting has no value for one person (shared must be true). On a Personal Parable a Versioned save is saved to the Parable.",
          "doNotUseWhen": "Do not use this operation to change a Pane's definition or Policies.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and paneKey.",
              "description": "The Parable or Pane was not found."
            },
            {
              "code": "PA-AU-002",
              "commonCorrection": "Read the setting again and retry with its latest revision.",
              "description": "The setting changed since it was read."
            },
            {
              "code": "PA-AU-040",
              "commonCorrection": "Send a value matching the Pane's Perception.",
              "description": "The value does not conform to the Pane's primitive."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "A shared setting needs the Pane's create.preferences Policy to create it and edit.preferences to change it; one a Policy reads also needs edit.policies, and Plot SQL also needs edit.plots.",
              "description": "The caller cannot save this setting."
            },
            {
              "code": "PA-AU-050",
              "commonCorrection": "Plot SQL saved as a setting must be declared Versioned\u003cPlotSql\u003e, and its handle must name one of the Pane's Plots.",
              "description": "The Pane declares this setting in a way that cannot be saved."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Returns the setting id, its new revision, and what the save did: applied live, published a Version, proposed Changes, or saved a Personal Parable.",
          "title": "Save a Preference",
          "useWhen": "Save a setting for a Pane in a Workspace Parable: a value for the signed-in person (Me), or a shared value for This Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/preferences/{preferenceId}": {
      "delete": {
        "description": "Deletes one setting if it is unchanged since expectedRevision. A person's setting can be deleted by that person; a shared one needs the Pane's delete.preferences Policy. Deleting a Versioned setting changes the Parable like saving one: it publishes a new Version (release minor unless major) or proposes Changes, as Save a Preference describes.",
        "operationId": "ParableAuthoringDeleteParablePreferenceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "preferenceId parameter",
            "in": "path",
            "name": "preferenceId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "expectedRevision",
            "required": true,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "release",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ParableReleaseLevelEnum"
            }
          },
          {
            "in": "query",
            "name": "message",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePreferenceWriteResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Delete a Preference",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.preferences.delete",
          "description": "Deletes one setting if it is unchanged since expectedRevision. A person's setting can be deleted by that person; a shared one needs the Pane's delete.preferences Policy. Deleting a Versioned setting changes the Parable like saving one: it publishes a new Version (release minor unless major) or proposes Changes, as Save a Preference describes.",
          "doNotUseWhen": "Do not use this operation to delete a Pane or its definition.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and preferenceId.",
              "description": "The Parable or Preference was not found."
            },
            {
              "code": "PA-AU-002",
              "commonCorrection": "Read the setting again and retry with its latest revision.",
              "description": "The setting changed since it was read."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "A shared setting needs the Pane's delete.preferences Policy.",
              "description": "The caller cannot delete this setting."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Deletes the setting, or for a Versioned setting publishes or proposes its removal; its history stays readable.",
          "title": "Delete a Preference",
          "useWhen": "Delete one saved setting from a Workspace Parable.",
          "visibility": "internal"
        }
      },
      "get": {
        "description": "Returns one setting: a value saved for a Pane, either a person's own (Me) or shared for This Parable. A person's settings are theirs alone; a shared setting follows the Pane's Policies. A Versioned setting reads the value of the definition named by refId or versionId (your Changes, or a Version), else the line's current one.",
        "operationId": "ParableAuthoringReadParablePreferenceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "preferenceId parameter",
            "in": "path",
            "name": "preferenceId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePreferenceView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Preference",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.preferences.get",
          "description": "Returns one setting: a value saved for a Pane, either a person's own (Me) or shared for This Parable. A person's settings are theirs alone; a shared setting follows the Pane's Policies. A Versioned setting reads the value of the definition named by refId or versionId (your Changes, or a Version), else the line's current one.",
          "doNotUseWhen": "Do not use this operation to change a setting.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and preferenceId.",
              "description": "The Parable or Preference was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access, or read your own settings.",
              "description": "The caller cannot read this Preference."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the setting.",
          "title": "Read a Preference",
          "useWhen": "Read one saved setting from a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/preferences/{preferenceId}/history": {
      "get": {
        "description": "Returns the earlier values of one setting you can see. Losing access to a setting also hides its history.",
        "operationId": "ParableAuthoringReadParablePreferenceHistoryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "preferenceId parameter",
            "in": "path",
            "name": "preferenceId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParablePreferenceHistoryView"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Preference's past values",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.preferences.history.list",
          "description": "Returns the earlier values of one setting you can see. Losing access to a setting also hides its history.",
          "doNotUseWhen": "Do not use this operation to change a setting.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and preferenceId.",
              "description": "The Parable or Preference was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access, or read your own settings.",
              "description": "The caller cannot read this Preference."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the earlier values of the setting, newest first.",
          "title": "Read a Preference's past values",
          "useWhen": "Read the history of one saved setting in a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/proposal-history": {
      "get": {
        "description": "Lists every set of Changes ever opened on a Parable, including the ones that have already finished.",
        "operationId": "ParableAuthoringWorkspaceParableProposalHistoryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParableProposalRecordView"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List what has happened to a Parable's Changes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposal-history.list",
          "description": "Lists every set of Changes ever opened on a Parable, including the ones that have already finished.",
          "doNotUseWhen": "Do not use this operation to edit or publish a Change set.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view Change history."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns published and pocketed Change records in history.",
          "title": "List what has happened to a Parable's Changes",
          "useWhen": "Review published and pocketed Change history for a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/proposals": {
      "get": {
        "description": "Lists the sets of Changes currently open on a Parable. Pocketed ones can be included if you ask for them.",
        "operationId": "ParableAuthoringWorkspaceParableProposalsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "archived",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParableProposalRecordView"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List open Changes on a Parable",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.list",
          "description": "Lists the sets of Changes currently open on a Parable. Pocketed ones can be included if you ask for them.",
          "doNotUseWhen": "Do not use this operation to read one Change set in detail or edit it.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view these Changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns Change records filtered by the archived selection.",
          "title": "List open Changes on a Parable",
          "useWhen": "List open Changes on a Workspace Parable, optionally including pocketed Changes.",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Opens a new set of Changes on a Parable for one Problem. Edits go into it and stay unpublished until someone submits and publishes them, so everyone else keeps seeing the current version in the meantime. Each Problem has at most one set of Changes, and a person may hold Pending Changes for several Problems at once. A Parable's root Problem holds no Changes of its own: start a Problem under it first. Inside a Ponder turn, a missing problemId means the turn's own Problem. Outside a turn, a missing problemId opens a set that no Problem holds. A Problem you cannot see answers as a missing one. Changes held by other people are left alone.",
        "operationId": "ParableAuthoringCreateWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateParableProposalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProposalCommandResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Start proposing Changes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.create",
          "description": "Opens a new set of Changes on a Parable for one Problem. Edits go into it and stay unpublished until someone submits and publishes them, so everyone else keeps seeing the current version in the meantime. Each Problem has at most one set of Changes, and a person may hold Pending Changes for several Problems at once. A Parable's root Problem holds no Changes of its own: start a Problem under it first. Inside a Ponder turn, a missing problemId means the turn's own Problem. Outside a turn, a missing problemId opens a set that no Problem holds. A Problem you cannot see answers as a missing one. Changes held by other people are left alone.",
          "doNotUseWhen": "Do not use this operation when an existing Change set should be edited.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context. Choose a Problem of this Parable that you can open.",
              "description": "The Parable was not found in the current Workspace, or problemId names no Problem of this Parable that you can see."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Switch the Parable to Publishing first. In the root, start a Problem under it with start_problem, then start Changes there. Take a Pocketed Problem out of the Pocket first. When the Problem holds your Pending Changes, edit them by their proposalId. When its Changes are someone else's, or no longer Pending, start a Problem under it for your change. From a Problem about another Parable, start a Problem under this Parable's root Problem, and continue there.",
              "description": "The Parable is in Personal mode, or the Problem cannot take a new set of Changes. It is the Parable's root Problem, it is in the Pocket, or it already has a set. Inside a Ponder turn, the current Problem can also be about another Parable. The refusal's details.problemRefusal names the Problem's case."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-007",
              "commonCorrection": "Restore the Parable before opening Changes.",
              "description": "The Parable is pocketed and cannot accept new Changes."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required authoring role.",
              "description": "The caller cannot open Changes on this Parable."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Creates or replays an idempotent command and returns the new Change set and receipt.",
          "title": "Start proposing Changes",
          "useWhen": "Open a new set of unpublished Changes on a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/raci": {
      "get": {
        "description": "Lists the people recorded as responsible for a Parable. This list records accountability; on its own it does not give anyone access.",
        "operationId": "ParableAuthoringWorkspaceParableRaciHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParablePrimaryRaciAssignmentView"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List who is responsible for a Parable",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.raci.list",
          "description": "Lists the people recorded as responsible for a Parable. This list records accountability; on its own it does not give anyone access.",
          "doNotUseWhen": "Do not use this operation to grant access or change assignments.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view responsibility assignments."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the responsibility assignments; assignments alone do not grant access.",
          "title": "List who is responsible for a Parable",
          "useWhen": "Inspect who is responsible for a Workspace Parable.",
          "visibility": "internal"
        }
      },
      "put": {
        "description": "Replaces the whole list of people responsible for a Parable in one step. Being listed here records accountability; on its own it does not give anyone access.",
        "operationId": "ParableAuthoringReplaceWorkspaceParableRaciHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplaceParableRaciInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReplaceParableRaciResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set who is responsible for a Parable",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.raci.replace",
          "description": "Replaces the whole list of people responsible for a Parable in one step. Being listed here records accountability; on its own it does not give anyone access.",
          "doNotUseWhen": "Do not use this operation to grant access without considering the Parable action contract.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current status and retry with the latest revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-022",
              "commonCorrection": "Include a valid Accountable assignment.",
              "description": "The resulting assignments would leave the Parable without an Accountable person."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required responsible role.",
              "description": "The caller cannot replace responsibility assignments."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Replaces the assignments and returns the updated Parable and responsibility list.",
          "title": "Set who is responsible for a Parable",
          "useWhen": "Replace the full responsibility assignment list for a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/report-context": {
      "get": {
        "description": "Returns the Refresh that Latest reads on the selected ref or Version: the newest completed Refresh whose Release is in the same major line as the Release being read. It also returns the newest run, the runs that have not ended, and the run named in runId. Every stored Plot reads its output from the Refresh Latest reads; a Plot that Refresh did not store has no data yet.",
        "operationId": "ParableAuthoringWorkspaceParableReportContextHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "runId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableReportContextView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check which Reports a Parable can run",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.report-context.get",
          "description": "Returns the Refresh that Latest reads on the selected ref or Version: the newest completed Refresh whose Release is in the same major line as the Release being read. It also returns the newest run, the runs that have not ended, and the run named in runId. Every stored Plot reads its output from the Refresh Latest reads; a Plot that Refresh did not store has no data yet.",
          "doNotUseWhen": "Do not use this operation to start a Report or to list past Refreshes. List them with List a Parable's Refreshes.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and confirm a published Version exists.",
              "description": "The Parable or published Report context was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view Report context."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Refresh Latest reads, the newest run, the runs still moving, the run named in runId, and reading availability.",
          "title": "Check which Reports a Parable can run",
          "useWhen": "Load which Refresh Latest reads for a Workspace Parable, the runs still moving, and whether Latest can be read.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/report-runs": {
      "get": {
        "description": "Returns one page of the Parable's retained runs, newest first. Each run says whether the selected ref or Version can read it: a Refresh of a Release in another major line cannot be read there. With plotKey, each run carries that Plot's result; without it, no Plot results. Ask for the next page with an offset of the runs already read.",
        "operationId": "ParableAuthoringWorkspaceParableReportRunsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "refId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "versionId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "plotKey",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "format": "double",
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "maximum": 50,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableReportRunPage"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List a Parable's Refreshes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.report-runs.list",
          "description": "Returns one page of the Parable's retained runs, newest first. Each run says whether the selected ref or Version can read it: a Refresh of a Release in another major line cannot be read there. With plotKey, each run carries that Plot's result; without it, no Plot results. Ask for the next page with an offset of the runs already read.",
          "doNotUseWhen": "Do not use this operation to find the Refresh Latest reads; check which Reports the Parable can run for that.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId, refId and versionId.",
              "description": "The Parable or the selected ref or Version was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view Report context."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns one page of runs, newest first, with their sources, and whether older runs follow.",
          "title": "List a Parable's Refreshes",
          "useWhen": "List a Workspace Parable's past Refreshes and Previews, newest first, one page at a time.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/rerun-preview/settings": {
      "get": {
        "description": "A Refresh reads the settings shared for This Parable as they were when it started. Lists each Pipeline of the published Version that reads them, directly or through a Plot view, and the Pipelines that read those, in this Parable and in other Parables.",
        "operationId": "ParableAuthoringParableSettingsRerunPreviewHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableRerunPreview"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check what changing shared settings would run again",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.preferences.rerun-preview.get",
          "description": "A Refresh reads the settings shared for This Parable as they were when it started. Lists each Pipeline of the published Version that reads them, directly or through a Plot view, and the Pipelines that read those, in this Parable and in other Parables.",
          "doNotUseWhen": "Do not use this operation to save a setting, or for a setting of your own (Me), which no Refresh reads.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId, and publish the Parable first.",
              "description": "The Parable was not found or has no published Version."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot read this Parable."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Pipelines that read the line's shared settings, the Pipelines that read them in any Parable of the Workspace, and the Refresh cost threshold.",
          "title": "Check what changing shared settings would run again",
          "useWhen": "Before changing a setting shared for This Parable, see which Pipelines its next Refresh would run again.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/rerun-preview/settings/{preferenceId}": {
      "post": {
        "description": "The settings rerun preview, with its estimate: each Pipeline that reads the shared settings gets an estimate run with the setting's saved value, which makes no paid call. The first request starts the runs; later requests return them as they finish, and retry starts again each one that failed.",
        "operationId": "ParableAuthoringParableSettingRerunEstimateHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "preferenceId parameter",
            "in": "path",
            "name": "preferenceId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParableRerunEstimateInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableRerunPreview"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Estimate the next Refresh after a shared setting change",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.preferences.rerun-estimate.start",
          "description": "The settings rerun preview, with its estimate: each Pipeline that reads the shared settings gets an estimate run with the setting's saved value, which makes no paid call. The first request starts the runs; later requests return them as they finish, and retry starts again each one that failed.",
          "doNotUseWhen": "Do not use this operation before the save, or for a setting of your own (Me), which no Refresh reads.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and preferenceId.",
              "description": "The Parable has no published Version, or the Preference was not found or is not shared for This Parable."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and a seat that may Refresh.",
              "description": "The caller cannot run a Refresh of this Parable."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "success": "Returns the Pipelines that read the line's shared settings, the Pipelines that read them, the estimated paid AI calls of the next Refresh, and the Refresh cost threshold.",
          "title": "Estimate the next Refresh after a shared setting change",
          "useWhen": "After saving a Live setting shared for This Parable, see what the next Refresh costs with the new value.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/rollouts": {
      "get": {
        "description": "Returns the Rollouts sent from one Parable line, newest first. It does not change the Parable.",
        "operationId": "ParableAuthoringParableDeploymentRolloutsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParableDeploymentRolloutSummaryView"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Parable Rollouts",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.rollouts.list",
          "description": "Returns the Rollouts sent from one Parable line, newest first. It does not change the Parable.",
          "doNotUseWhen": "Do not use this operation to deploy or revoke access.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId.",
              "description": "The Parable line was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Hold Parable view or manage permission and a RACI seat on the line.",
              "description": "The caller cannot view this line."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Rollout summaries for the line.",
          "title": "List Parable Rollouts",
          "useWhen": "See what a Parable line has sent and to whom.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/versions": {
      "get": {
        "description": "Lists every Version of a Parable that has been published, in the order they happened.",
        "operationId": "ParableAuthoringParableVersionsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParableDeploymentVersionSummaryView"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List a Parable's published Versions",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.versions.list",
          "description": "Lists every Version of a Parable that has been published, in the order they happened.",
          "doNotUseWhen": "Do not use this operation to read one Version package or create a Version.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-028",
              "commonCorrection": "Use a published Version returned by this operation.",
              "description": "A requested history entry is not a published Version."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view Version history."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns published Version summaries for the Parable.",
          "title": "List a Parable's published Versions",
          "useWhen": "List published Versions of a Workspace Parable.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/versions/{versionId}/package": {
      "get": {
        "description": "Returns everything inside one published Version of a Parable, exactly as it was at the moment it was published.",
        "operationId": "ParableAuthoringWorkspaceParableVersionPackageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "versionId parameter",
            "in": "path",
            "name": "versionId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableEffectivePackageRead"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the contents of a published Version",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.version-packages.get",
          "description": "Returns everything inside one published Version of a Parable, exactly as it was at the moment it was published.",
          "doNotUseWhen": "Do not use this operation for the current draft or an unpublished commit.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check rootRefId and versionId.",
              "description": "The Parable or Version was not found."
            },
            {
              "code": "PA-AU-028",
              "commonCorrection": "Use a published Version id from the Version list.",
              "description": "The supplied identifier is not a published Version."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view this Version."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the effective package captured by the selected published Version.",
          "title": "Read the contents of a published Version",
          "useWhen": "Read the package captured in one published Workspace Parable Version.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/view-as": {
      "post": {
        "description": "Starts a read-only preview of this Parable as one active member of its Workspace, and records who started it. Requires Publishing or Primary on the Parable. A preview reaches only people seated at or below you and never shows what you could not read yourself: the person's own settings stay hidden, and Provider data must pass both your Source Policies and theirs. Returns the preview id every read of the Parable carries in X-Parable-View-As, the participation the Policies are decided for, and the person the preview runs as. A request that carries the id and changes anything is refused.",
        "operationId": "ParableAuthoringStartParableViewAsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartParableViewAsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableViewAsView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Start viewing a Parable as someone else",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.viewas.start",
          "description": "Starts a read-only preview of this Parable as one active member of its Workspace, and records who started it. Requires Publishing or Primary on the Parable. A preview reaches only people seated at or below you and never shows what you could not read yourself: the person's own settings stay hidden, and Provider data must pass both your Source Policies and theirs. Returns the preview id every read of the Parable carries in X-Parable-View-As, the participation the Policies are decided for, and the person the preview runs as. A request that carries the id and changes anything is refused.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Start viewing a Parable as someone else",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/primaries/{rootRefId}/view-as/targets": {
      "get": {
        "description": "Lists the active members of the Parable's Workspace matching the search, and the people invited to it who have not joined yet, each with their seat on the Parable and whether you may preview as them. Invited people are marked and cannot be previewed until they join. Requires Publishing or Primary on the Parable.",
        "operationId": "ParableAuthoringListParableViewAsTargetsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableViewAsTargets"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List who you can view a Parable as",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.viewas.targets",
          "description": "Lists the active members of the Parable's Workspace matching the search, and the people invited to it who have not joined yet, each with their seat on the Parable and whether you may preview as them. Invited people are marked and cannot be previewed until they join. Requires Publishing or Primary on the Parable.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List who you can view a Parable as",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}": {
      "get": {
        "description": "Returns a single set of Changes: where it has got to, and which part of the Parable it is aimed at.",
        "operationId": "ParableAuthoringWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProposalRecordView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check one set of Changes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.get",
          "description": "Returns a single set of Changes: where it has got to, and which part of the Parable it is aimed at.",
          "doNotUseWhen": "Do not use this operation to read the effective draft package or change the set.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set was not found in the current Workspace."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view this Change set."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the selected Change record and stage.",
          "title": "Check one set of Changes",
          "useWhen": "Read one Workspace Parable Change set and its current stage.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/archive": {
      "post": {
        "description": "Puts a set of Changes away without deleting it. The edits inside it are kept, and it can be taken back out at any time.",
        "operationId": "ParableAuthoringArchiveWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParableProposalCommandInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProposalCommandResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Pocket a set of Changes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.pocket",
          "description": "Puts a set of Changes away without deleting it. The edits inside it are kept, and it can be taken back out at any time.",
          "doNotUseWhen": "Do not use this operation to delete or publish Changes.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set was not found."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read the current stage and choose the supported action.",
              "description": "The Change set cannot be pocketed from its current stage."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required authoring role.",
              "description": "The caller cannot pocket these Changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the Change set in Pocketed stage with edits preserved.",
          "title": "Pocket a set of Changes",
          "useWhen": "Put a Workspace Parable Change set away without deleting its edits.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/delete": {
      "post": {
        "description": "Permanently removes a set of Changes that has already been pocketed. This cannot be undone, so it needs a person's approval.",
        "operationId": "ParableAuthoringDeleteWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParableProposalCommandInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProposalCommandResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Delete pocketed Changes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.delete",
          "description": "Permanently removes a set of Changes that has already been pocketed. This cannot be undone, so it needs a person's approval.",
          "doNotUseWhen": "Do not use this operation for active, proposed, or published Changes; deletion cannot be undone.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set was not found."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Pocket the Change set first, or keep it if it is still active.",
              "description": "Only pocketed Changes can be deleted."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required authoring role.",
              "description": "The caller cannot delete these Changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Deletes the pocketed Change set and returns its command receipt.",
          "title": "Delete pocketed Changes",
          "useWhen": "Permanently remove a Workspace Parable Change set that is already pocketed.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/patch": {
      "post": {
        "description": "Takes a set of Changes that was already submitted back to Pending so more edits can go into it. Everything already in it is kept.",
        "operationId": "ParableAuthoringPatchWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParableProposalCommandInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProposalCommandResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Reopen Changes for editing",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.patch",
          "description": "Takes a set of Changes that was already submitted back to Pending so more edits can go into it. Everything already in it is kept.",
          "doNotUseWhen": "Do not use this operation for pocketed or published Changes.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set was not found."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read the current stage and choose the supported action.",
              "description": "The Change set cannot be reopened from its current stage."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required authoring role.",
              "description": "The caller cannot reopen these Changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the Change set in Pending stage with existing edits preserved.",
          "title": "Reopen Changes for editing",
          "useWhen": "Return submitted Workspace Parable Changes to Pending so they can be edited.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/prepare": {
      "post": {
        "description": "Runs the checks a set of Changes has to pass before it can be published, and marks it ready. It does not publish anything.",
        "operationId": "ParableAuthoringPrepareWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PrepareParableProposalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PrepareParableProposalResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Get Changes ready to publish",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.prepare",
          "description": "Runs the checks a set of Changes has to pass before it can be published, and marks it ready. It does not publish anything.",
          "doNotUseWhen": "Do not use this operation to publish; call Publish Changes after preparation succeeds.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set or target Parable was not found."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current state and retry with the latest revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-011",
              "commonCorrection": "Reload preparation findings and submit choices against the latest review hash.",
              "description": "A selected resolution is stale."
            },
            {
              "code": "PA-AU-017",
              "commonCorrection": "Run preparation again against the current Change set.",
              "description": "The reviewed Change set no longer matches its prepared content."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required RACI role.",
              "description": "The caller cannot prepare these Changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns preparation findings, selected resolutions, the prepared Change set, and a receipt.",
          "title": "Get Changes ready to publish",
          "useWhen": "Run publishing checks and resolve findings for a Workspace Parable Change set.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/prepare-for-push": {
      "post": {
        "description": "Runs the checks a set of Changes has to pass before it can be published and deployed to other Workspaces, and marks it ready. Publish Changes accepts it too, except for Changes that pull a Delivery, which need Get Changes ready to publish. It does not publish anything.",
        "operationId": "ParableAuthoringPrepareParableProposalForDeployHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PrepareParableProposalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PrepareParableProposalResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Get Changes ready to publish and deploy",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.prepare-for-deploy",
          "description": "Runs the checks a set of Changes has to pass before it can be published and deployed to other Workspaces, and marks it ready. Publish Changes accepts it too, except for Changes that pull a Delivery, which need Get Changes ready to publish. It does not publish anything.",
          "doNotUseWhen": "Do not use this operation before a single-Workspace publish; use Get Changes ready to publish. Do not use it to publish.",
          "errors": [
            {
              "code": "PA-AU-032",
              "commonCorrection": "Select the origin Workspace and retry with the current authenticated context.",
              "description": "Plot checks require an explicitly selected Workspace."
            },
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId.",
              "description": "The Change set or target Parable was not found."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current state and retry with the latest revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-011",
              "commonCorrection": "Reload preparation findings and submit choices against the latest review hash.",
              "description": "A selected resolution is stale."
            },
            {
              "code": "PA-AU-017",
              "commonCorrection": "Run preparation again against the current Change set.",
              "description": "The reviewed Change set no longer matches its prepared content."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use Parable manage permission and the required responsible role.",
              "description": "The caller cannot prepare these Changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns preparation findings, selected resolutions, the prepared Change set, and a receipt.",
          "title": "Get Changes ready to publish and deploy",
          "useWhen": "Run publishing checks on Changes you intend to publish AND deploy to selected Workspaces.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/propose": {
      "post": {
        "description": "Closes a set of Changes to further edits and puts it up for review. A set with nothing in it is refused.",
        "operationId": "ParableAuthoringProposeWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProposeParableProposalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProposalCommandResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Submit Changes for review",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.propose",
          "description": "Closes a set of Changes to further edits and puts it up for review. A set with nothing in it is refused.",
          "doNotUseWhen": "Do not use this operation for an empty set or to publish directly.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set was not found."
            },
            {
              "code": "PA-AU-002",
              "commonCorrection": "Read the Change set again and retry with its current version.",
              "description": "The draft changed after the version this request was sent for."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current Change status and retry with the latest revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-004",
              "commonCorrection": "Read the Change stage and choose the next valid action.",
              "description": "The Change set is no longer Pending, or its source is sealed."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read the Change stage and choose the next valid action.",
              "description": "The Change set is not in a state that can be submitted."
            },
            {
              "code": "PA-AU-007",
              "commonCorrection": "Un-Pocket the Parable, then try again.",
              "description": "The Parable is Pocketed, or its Deployment is archived."
            },
            {
              "code": "PA-AU-025",
              "commonCorrection": "Open the Change set, edit or Pocket each colliding Patch, then submit again.",
              "description": "The Change set collides with a version published after it was opened."
            },
            {
              "code": "PA-AU-034",
              "commonCorrection": "Save at least one Piece change before submitting.",
              "description": "The Change set contains no authored delta."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required authoring role.",
              "description": "The caller cannot submit these Changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Closes the Change set to editing and returns its proposed state and receipt.",
          "title": "Submit Changes for review",
          "useWhen": "Seal a non-empty Workspace Parable Change set and submit it for review.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/publish": {
      "post": {
        "description": "Makes a prepared set of Changes the current version of the Parable and sends it everywhere the Parable is Pushed. Needs a person's approval, because everyone who can see the Parable will see the result.",
        "operationId": "ParableAuthoringPublishWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublishWorkspaceParableProposalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PublishWorkspaceParableProposalResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Publish Changes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.publish",
          "description": "Makes a prepared set of Changes the current version of the Parable and sends it everywhere the Parable is Pushed. Needs a person's approval, because everyone who can see the Parable will see the result.",
          "doNotUseWhen": "Do not use this operation for unprepared Changes or to change recipients without publishing.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set or target Parable was not found."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current Change state and retry with the latest revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-010",
              "commonCorrection": "Prepare the Changes and resolve every required finding first.",
              "description": "The Change set has not passed required preparation."
            },
            {
              "code": "PA-AU-017",
              "commonCorrection": "Prepare the current Changes again before publishing.",
              "description": "The prepared review is stale."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required responsible role.",
              "description": "The caller cannot publish these Changes."
            },
            {
              "code": "PA-AU-021",
              "commonCorrection": "Add a Change or select a Change set containing authored content.",
              "description": "There is no publishable Change content."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Publishes the Change set and returns the command receipt, Version, and Delivery state.",
          "title": "Publish Changes",
          "useWhen": "Publish prepared Workspace Parable Changes into a new Version.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/publish-and-push": {
      "post": {
        "description": "Publishes reviewed Changes and deploys the resulting Version to the Workspaces you choose. Rechecks the captured Plot definition, parameters and scheduled plan in the selected origin Workspace before sealing; that verdict does not certify destination Workspace catalogs. Needs a person's approval, because everyone in those Workspaces will see the result.",
        "operationId": "ParableAuthoringPublishParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublishAdminParableProposalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PublishAdminParableProposalResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Publish and deploy a Parable",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.publish-and-deploy",
          "description": "Publishes reviewed Changes and deploys the resulting Version to the Workspaces you choose. Rechecks the captured Plot definition, parameters and scheduled plan in the selected origin Workspace before sealing; that verdict does not certify destination Workspace catalogs. Needs a person's approval, because everyone in those Workspaces will see the result.",
          "doNotUseWhen": "Do not use this operation for unprepared Changes or when deployment should be changed without publishing.",
          "errors": [
            {
              "code": "PA-AU-033",
              "commonCorrection": "Read Prepare findings, correct the Plot or wait for checking to recover, then Prepare again.",
              "description": "A Plot does not pass current validation or planning in the selected Workspace."
            },
            {
              "code": "PA-AU-032",
              "commonCorrection": "Select the explicit Workspace origin; a platform origin cannot use an empty catalog.",
              "description": "The Plot has no selected Workspace validation context."
            },
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId.",
              "description": "The Change set or target Parable was not found."
            },
            {
              "code": "PA-AU-002",
              "commonCorrection": "Read current Change state and retry with its latest revision.",
              "description": "The source revision is stale."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current status and retry with the latest aggregate revision.",
              "description": "The Parable aggregate revision is stale."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key for this request.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-010",
              "commonCorrection": "Prepare the Changes and resolve every required finding first.",
              "description": "The Change set has not passed required preparation."
            },
            {
              "code": "PA-AU-016",
              "commonCorrection": "Choose valid permitted Workspaces for the target mode.",
              "description": "The selected deployment targets are invalid."
            },
            {
              "code": "PA-AU-017",
              "commonCorrection": "Prepare the current Changes again before publishing.",
              "description": "The prepared review is stale."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use Parable manage permission and the required responsible role.",
              "description": "The caller cannot publish or deploy this Parable."
            },
            {
              "code": "PA-AU-020",
              "commonCorrection": "Configure a valid deployment target before publishing with deployment.",
              "description": "Deployment is not configured for this Parable."
            },
            {
              "code": "PA-AU-021",
              "commonCorrection": "Add a Change or select a Change set containing authored content.",
              "description": "There is no publishable Change content."
            },
            {
              "code": "PA-AU-022",
              "commonCorrection": "Assign a valid Accountable person before publishing.",
              "description": "The Parable lacks a required Accountable assignment."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProposalVersion",
              "/expectedAggregateRevision",
              "/expectedRootRefVersion"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Publishes the Change set, creates a Version and Rollout, and returns the command receipt and result.",
          "title": "Publish and deploy a Parable",
          "useWhen": "Publish reviewed Parable Changes and deploy the resulting Version to selected Workspaces.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/restore": {
      "post": {
        "description": "Brings a pocketed set of Changes back into normal use, exactly as it was.",
        "operationId": "ParableAuthoringRestoreWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParableProposalCommandInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProposalCommandResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Take Changes out of the Pocket",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposals.restore",
          "description": "Brings a pocketed set of Changes back into normal use, exactly as it was.",
          "doNotUseWhen": "Do not use this operation for pending, proposed, or published Changes.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set was not found."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read the current stage and choose the supported action.",
              "description": "The Change set is not pocketed and cannot be restored."
            },
            {
              "code": "PA-AU-006",
              "commonCorrection": "Generate a new idempotency key.",
              "description": "The idempotency key was already used for different input."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required authoring role.",
              "description": "The caller cannot restore these Changes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the restored Change set in its editable stage.",
          "title": "Take Changes out of the Pocket",
          "useWhen": "Restore pocketed Workspace Parable Changes for normal use.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/revalidate": {
      "post": {
        "description": "Retries unchecked or stale Plot SQL validation on a draft proposal's source ref with one shared ten-second budget across both passes. Current completed verdicts, including SQL errors, are skipped. Records diagnostics and last-good output schemas without changing authored content. Requires the Parable manage permission. Repeating the request with the same idempotency key returns the recorded receipt without rerunning validation.",
        "operationId": "ParableAuthoringRevalidateWorkspaceParableProposalPlotsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RevalidateParablePlotsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RevalidateParablePlotsResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Revalidate Plot SQL for a proposal",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parables.authoring.proposal-revalidate-plots",
          "description": "Retries unchecked or stale Plot SQL validation on a draft proposal's source ref with one shared ten-second budget across both passes. Current completed verdicts, including SQL errors, are skipped. Records diagnostics and last-good output schemas without changing authored content. Requires the Parable manage permission. Repeating the request with the same idempotency key returns the recorded receipt without rerunning validation.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Revalidate Plot SQL for a proposal",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/actions/save": {
      "post": {
        "description": "Create or edit a Package, Page, Pane, Plot, or Palette in Publishing mode; a Page's or Pane's Perception and Policies are fields of the Page or Pane. Saves a sparse Piece package into an open set of Changes; no separate Process is needed. Read the current revision and sibling order first; root Packages and Pages share sibling positions. Supply each new Piece's required identity and icon fields, and give every Page, Package, Pane and Plot the save writes a one-sentence description. Inside a Ponder turn, the set must belong to the current Problem or to a Problem under it. Nobody else sees the edit until those Changes are submitted and published.",
        "operationId": "ParableAuthoringSaveWorkspaceParableProposalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveParableProposalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SaveParableProposalResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Edit a Piece (Publishing mode)",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposal-drafts.save",
          "description": "Create or edit a Package, Page, Pane, Plot, or Palette in Publishing mode; a Page's or Pane's Perception and Policies are fields of the Page or Pane. Saves a sparse Piece package into an open set of Changes; no separate Process is needed. Read the current revision and sibling order first; root Packages and Pages share sibling positions. Supply each new Piece's required identity and icon fields, and give every Page, Package, Pane and Plot the save writes a one-sentence description. Inside a Ponder turn, the set must belong to the current Problem or to a Problem under it. Nobody else sees the edit until those Changes are submitted and published.",
          "doNotUseWhen": "Do not use this operation for Personal mode, after Changes have been sealed, or to author a Perception manifest; Perception manifests are generated from source.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set or target Parable was not found."
            },
            {
              "code": "PA-AU-002",
              "commonCorrection": "Read the current draft package and retry with its latest ref version.",
              "description": "The Piece source revision is stale."
            },
            {
              "code": "PA-AU-004",
              "commonCorrection": "Reopen the Change set before editing it.",
              "description": "The Change set source is sealed."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "On a Personal Parable, edit with edit_pieces and a null proposalId. Inside a Ponder turn, edit the current Problem's own Changes, or start them with start_proposing_changes. In the root Problem, first start a Problem under it. From a Problem about another Parable, start a Problem under this Parable's root Problem, and continue there.",
              "description": "The Parable is in Personal mode, or these Changes review a pulled Delivery that is no longer in review. Inside a Ponder turn, these Changes can also belong to no Problem, or to a Problem that is neither the current Problem nor under it. Or the current Problem is about another Parable."
            },
            {
              "code": "PA-AU-035",
              "commonCorrection": "Use only declared Piece handles and supported Parable modules.",
              "description": "Piece source imports an unavailable module."
            },
            {
              "code": "PA-AU-036",
              "commonCorrection": "Reduce the submitted source before retrying.",
              "description": "Piece source exceeds its size limit."
            },
            {
              "code": "PA-AU-037",
              "commonCorrection": "Read current Pieces and choose an unused handle.",
              "description": "Another Piece already uses the requested handle."
            },
            {
              "code": "PA-AU-038",
              "commonCorrection": "Declare the referenced Piece in the same save or correct the handle.",
              "description": "Piece source references a handle that is not declared."
            },
            {
              "code": "PA-AU-039",
              "commonCorrection": "Correct the returned path; author Perception source and let the server generate its manifest.",
              "description": "The Piece definition or manifest is invalid."
            },
            {
              "code": "PA-AU-040",
              "commonCorrection": "Correct the Preference value or its source contract.",
              "description": "A Preference does not conform to its declared contract."
            },
            {
              "code": "PA-AU-041",
              "commonCorrection": "Correct the Plot SQL using the planner details.",
              "description": "Plot SQL could not be planned."
            },
            {
              "code": "PA-AU-046",
              "commonCorrection": "Give each Piece the details list a one-sentence description of what it is for.",
              "description": "A Page, Package, Pane or Plot the save writes has no description."
            },
            {
              "code": "PA-AU-026",
              "commonCorrection": "Ask their author to make the edit. Or start a Problem under the Problem that holds them, and edit that Problem's Changes.",
              "description": "Someone else authored these Changes, and only their author edits them."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required authoring role.",
              "description": "The caller cannot edit this Change set."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRefVersion"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Saves the sparse Piece package into the Change set and returns its current state.",
          "title": "Edit a Piece (Publishing mode)",
          "useWhen": "Create or edit a Piece inside an open Workspace Parable Change set.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/data/catalog-snapshot": {
      "get": {
        "description": "Returns the catalog snapshot for a draft proposal, built from the proposal's source ref so a Plot added in the draft is visible to its sibling Plots. Only the proposal's author may read it. Requires the data catalog permission in addition to Parable read access; a reader without it receives a 403 with error code PA-AU-031. The response carries a weak ETag, and a request with a matching If-None-Match returns 304.",
        "operationId": "ParableAuthoringWorkspaceParableProposalCatalogSnapshotHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CatalogSnapshot"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Get the catalog snapshot for a proposal",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parables.authoring.proposal-catalog-snapshot",
          "description": "Returns the catalog snapshot for a draft proposal, built from the proposal's source ref so a Plot added in the draft is visible to its sibling Plots. Only the proposal's author may read it. Requires the data catalog permission in addition to Parable read access; a reader without it receives a 403 with error code PA-AU-031. The response carries a weak ETag, and a request with a matching If-None-Match returns 304.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Get the catalog snapshot for a proposal",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/package": {
      "get": {
        "description": "Returns what a Parable would look like with one particular set of Changes applied. Other open Changes are not included.",
        "operationId": "ParableAuthoringWorkspaceParableProposalPackageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableEffectivePackageRead"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the contents of a set of Changes",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposal-packages.get",
          "description": "Returns what a Parable would look like with one particular set of Changes applied. Other open Changes are not included.",
          "doNotUseWhen": "Do not use this operation to read the live Version or edit the draft.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set was not found or is not visible in the current Workspace."
            },
            {
              "code": "PA-AU-026",
              "commonCorrection": "Ask the draft author to provide access or use a Change set you authored.",
              "description": "The draft belongs to another author for this scoped draft read."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot view this draft."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the draft package for the selected Change set.",
          "title": "Read the contents of a set of Changes",
          "useWhen": "Read the effective draft package for one Workspace Parable Change set.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/prepare": {
      "get": {
        "description": "Returns what the server found when it looked at a set of Changes: anything blocking publication, and whether it is ready to go.",
        "operationId": "ParableAuthoringWorkspaceParablePrepareHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParablePrepareView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check what publishing these Changes would do",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposal-preparation.get",
          "description": "Returns what the server found when it looked at a set of Changes: anything blocking publication, and whether it is ready to go.",
          "doNotUseWhen": "Do not use this operation to prepare or publish the Change set.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set or target Parable was not found."
            },
            {
              "code": "PA-AU-026",
              "commonCorrection": "Ask the draft author to prepare it or use a Change set you authored.",
              "description": "The draft is not owned by the caller for this preparation read."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable access and the required RACI role.",
              "description": "The caller cannot inspect this preparation."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns preparation findings and expected publishing effects.",
          "title": "Check what publishing these Changes would do",
          "useWhen": "Inspect what publishing a Workspace Parable Change set would do.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/proposals/{proposalId}/rerun-preview": {
      "post": {
        "description": "Lists each Pipeline whose next Refresh would run again if these Changes were published, with why: its SQL or parameters, its Policies, or a Plot view it reads. Each lists the columns the publish adds, removes or retypes. It also lists the Pipelines that read them, in this Parable and in other Parables, and which of those refresh on their own after their sources refresh. The estimate counts the paid AI calls each changed Pipeline of this Parable would make, from an estimate run of the Changes that makes no call: the first request starts the runs, later requests return them as they finish, and retry starts again each one that failed.",
        "operationId": "ParableAuthoringWorkspaceParableProposalRerunPreviewHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "proposalId parameter",
            "in": "path",
            "name": "proposalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParableRerunEstimateInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableRerunPreview"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Estimate what publishing these Changes would run again",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.proposal-rerun-estimate.start",
          "description": "Lists each Pipeline whose next Refresh would run again if these Changes were published, with why: its SQL or parameters, its Policies, or a Plot view it reads. Each lists the columns the publish adds, removes or retypes. It also lists the Pipelines that read them, in this Parable and in other Parables, and which of those refresh on their own after their sources refresh. The estimate counts the paid AI calls each changed Pipeline of this Parable would make, from an estimate run of the Changes that makes no call: the first request starts the runs, later requests return them as they finish, and retry starts again each one that failed.",
          "doNotUseWhen": "Do not use this operation to publish the Changes, or when you cannot run a Refresh of this Parable.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the proposalId and Workspace context.",
              "description": "The Change set was not found or is not visible in the current Workspace."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Propose the Changes first.",
              "description": "The Changes are not proposed, or are already published."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and a seat that may Refresh.",
              "description": "The caller cannot run a Refresh of this Parable."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "success": "Returns the Pipelines the publish changes, the Pipelines that read them in any Parable of the Workspace, the estimate as it stands, and the Refresh cost threshold.",
          "title": "Estimate what publishing these Changes would run again",
          "useWhen": "Before publishing a proposed Workspace set of Changes, see which Pipelines its next Refresh would run again, why, and what their paid AI calls would cost.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/recurrence-preview": {
      "post": {
        "description": "Works out the next few times a scheduled Parable is due to run. Nothing is scheduled and nothing changes.",
        "operationId": "ParableAuthoringPreviewWorkspaceParableRecurrenceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParableRecurrencePreviewInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableRecurrencePreviewView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Preview when a Parable runs next",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.recurrences.preview",
          "description": "Works out the next few times a scheduled Parable is due to run. Nothing is scheduled and nothing changes.",
          "doNotUseWhen": "Do not use this operation to save a recurrence or enqueue a run.",
          "errors": [
            {
              "code": "PA-AU-009",
              "commonCorrection": "Provide a valid recurrence rule, timestamp, timezone, and count.",
              "description": "The recurrence rule, anchor, timezone, or count could not be evaluated."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the next requested occurrence times and any truncation reason.",
          "title": "Preview when a Parable runs next",
          "useWhen": "Calculate upcoming run times for a Workspace Parable recurrence without scheduling it.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/rollouts/{rolloutId}": {
      "get": {
        "description": "Returns one Rollout and its distribution state. It does not change the Parable.",
        "operationId": "ParableAuthoringParableDeploymentRolloutHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rolloutId parameter",
            "in": "path",
            "name": "rolloutId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableDeploymentRolloutSummaryView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Parable Rollout",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.rollouts.read",
          "description": "Returns one Rollout and its distribution state. It does not change the Parable.",
          "doNotUseWhen": "Do not use this operation to change a Rollout.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rolloutId.",
              "description": "The Rollout was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Hold Parable view or manage permission and the required RACI access.",
              "description": "The caller cannot view this Rollout."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Rollout summary.",
          "title": "Read a Parable Rollout",
          "useWhen": "Read one Rollout and its distribution state.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/authoring/rollouts/{rolloutId}/targets": {
      "get": {
        "description": "Returns the Workspace targets for one Rollout. It does not change the Parable.",
        "operationId": "ParableAuthoringParableDeploymentRolloutTargetsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rolloutId parameter",
            "in": "path",
            "name": "rolloutId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParableDeploymentRolloutTargetView"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Rollout targets",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.rollouts.targets.list",
          "description": "Returns the Workspace targets for one Rollout. It does not change the Parable.",
          "doNotUseWhen": "Do not use this operation to deploy or revoke access.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rolloutId.",
              "description": "The Rollout was not found."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Hold Parable view or manage permission plus tenant view permission.",
              "description": "The caller cannot view Rollout targets or Workspace identities."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns Workspace targets and delivery details for the Rollout.",
          "title": "List Rollout targets",
          "useWhen": "See which Workspaces received a Rollout.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/commands/{correlationId}": {
      "get": {
        "description": "Finds a command that was run in this Workspace using its correlation ID. An ID belonging to another Workspace comes back empty, exactly like an ID that never existed.",
        "operationId": "ParablesParableCommandReceiptHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "correlationId parameter",
            "in": "path",
            "name": "correlationId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableCommandReceiptView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Look up an earlier command by its ID",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.definitions.parable-command-receipt",
          "description": "Finds a command that was run in this Workspace using its correlation ID. An ID belonging to another Workspace comes back empty, exactly like an ID that never existed.",
          "doNotUseWhen": "Do not use this operation to start a command or inspect commands from another Workspace.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or manage permission.",
              "description": "The caller cannot view or manage Parables in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the command receipt when the correlation ID belongs to this Workspace, otherwise null.",
          "title": "Look up an earlier command by its ID",
          "useWhen": "Check the recorded outcome of a command previously run in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/definitions/{slug}": {
      "get": {
        "description": "Returns a Parable definition together with its milestones and how far this Workspace has got on each one. Progress is worked out from the Providers the Workspace has actually connected.",
        "operationId": "ParablesDefinitionsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "slug parameter",
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "description": "A URL friendly version of a string",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Parable"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Parable definition and its milestones",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.definitions.definitions",
          "description": "Returns a Parable definition together with its milestones and how far this Workspace has got on each one. Progress is worked out from the Providers the Workspace has actually connected.",
          "doNotUseWhen": "Do not use this operation to read a published Parable or change milestone progress.",
          "errors": [
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the Parable definition slug.",
              "description": "No Parable definition matches the supplied slug."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Workspace view permission.",
              "description": "The caller cannot view this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the requested Parable definition with its milestones and current Workspace progress.",
          "title": "Read a Parable definition and its milestones",
          "useWhen": "Inspect a Parable definition and see which data milestones this Workspace has completed.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/deployments": {
      "get": {
        "description": "Lists the published Parables this Workspace and this person can see. The server decides what is visible.",
        "operationId": "ParablesTenantParablesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantParableSummary"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List published Parables",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.definitions.tenant-parables",
          "description": "Lists the published Parables this Workspace and this person can see. The server decides what is visible.",
          "doNotUseWhen": "Do not use this operation to read a specific published Parable or edit a Parable.",
          "errors": [
            {
              "code": "WA-RS-003",
              "commonCorrection": "Contact support to page this collection.",
              "description": "This Workspace has too many published Parables to return in one response."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or manage permission.",
              "description": "The caller cannot view or manage Parables in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the published Parable summaries visible to the current person.",
          "title": "List published Parables",
          "useWhen": "Browse the published Parables that the current person can access in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/deployments/{handle}": {
      "get": {
        "description": "Returns one published Parable and the content the current person is allowed to see. A Parable that is hidden or out of reach reads as not found.",
        "operationId": "ParablesTenantParableHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "handle parameter",
            "in": "path",
            "name": "handle",
            "required": true,
            "schema": {
              "description": "A mutable camelCase code, path, and file identifier; URLs use stable UUIDs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantParable"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a published Parable",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.definitions.tenant-parable",
          "description": "Returns one published Parable and the content the current person is allowed to see. A Parable that is hidden or out of reach reads as not found.",
          "doNotUseWhen": "Do not use this operation to read a definition by slug or modify a Parable.",
          "errors": [
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the Parable handle and Workspace access.",
              "description": "The Parable is unknown, hidden, retracted, or not visible to this person."
            },
            {
              "code": "WA-RS-003",
              "commonCorrection": "Contact support to page the published Parables.",
              "description": "This Workspace has too many published Parables to resolve this request."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or manage permission.",
              "description": "The caller cannot view or manage Parables in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the visible published Parable and its effective package.",
          "title": "Read a published Parable",
          "useWhen": "Read the published Parable package that is visible to the current person in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/directory": {
      "get": {
        "description": "Lists the Parables in this Workspace's directory.",
        "operationId": "ParableDirectoryWorkspaceParableDirectoryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "includeArchived",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableDirectoryResultView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List the Parable directory",
        "tags": [
          "parable-directory"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.directory.workspace-parable-directory",
          "description": "Lists the Parables in this Workspace's directory.",
          "doNotUseWhen": "Do not use this operation to read one directory entry or its Pages.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or manage permission.",
              "description": "The caller cannot view or manage Parables in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the matching Parable directory entries for this Workspace.",
          "title": "List the Parable directory",
          "useWhen": "Browse or search the Parables in this Workspace directory.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/directory/by-parable/{parableId}": {
      "get": {
        "description": "Returns the same directory entry, looked up by the Parable it describes rather than by this Workspace's copy of it — so one identifier works from either direction.",
        "operationId": "ParableDirectoryWorkspaceParableDirectoryEntryByParableHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "parableId parameter",
            "in": "path",
            "name": "parableId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableDirectoryEntryView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Find a directory entry by its Parable",
        "tags": [
          "parable-directory"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.directory.workspace-parable-directory-entry-by-parable",
          "description": "Returns the same directory entry, looked up by the Parable it describes rather than by this Workspace's copy of it — so one identifier works from either direction.",
          "doNotUseWhen": "Do not use this operation when you already have the Workspace root ref ID or need to search.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Check the Parable ID and Workspace context.",
              "description": "The Parable is not present in this Workspace directory."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or manage permission.",
              "description": "The caller cannot view or manage Parables in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the directory entry when this Workspace holds the requested Parable.",
          "title": "Find a directory entry by its Parable",
          "useWhen": "Read a Workspace directory entry by the Parable ID it describes.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/directory/with-previews": {
      "get": {
        "description": "Lists the Parables in this Workspace's directory, as List the Parable directory does, with the preview of each entry that has one. The sidebar draws the previews on the Parable cards.",
        "operationId": "ParableDirectoryWorkspaceParableDirectoryWithPreviewsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "includeArchived",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableDirectoryPreviewResultView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List the Parable directory with previews",
        "tags": [
          "parable-directory"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.directory.workspace-parable-directory-previews",
          "description": "Lists the Parables in this Workspace's directory, as List the Parable directory does, with the preview of each entry that has one. The sidebar draws the previews on the Parable cards.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "List the Parable directory with previews",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/directory/{rootRefId}": {
      "get": {
        "description": "Returns a single entry from this Workspace's Parable directory.",
        "operationId": "ParableDirectoryWorkspaceParableDirectoryEntryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableDirectoryEntryView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read one directory entry",
        "tags": [
          "parable-directory"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.directory.workspace-parable-directory-entry",
          "description": "Returns a single entry from this Workspace's Parable directory.",
          "doNotUseWhen": "Do not use this operation to search the directory or look up an entry by Parable ID.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Check the root ref ID and Workspace context.",
              "description": "The directory entry does not exist in this Workspace."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or manage permission.",
              "description": "The caller cannot view or manage Parables in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the directory entry when the root ref belongs to this Workspace.",
          "title": "Read one directory entry",
          "useWhen": "Read one Workspace Parable directory entry by its root ref ID.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/directory/{rootRefId}/pages": {
      "get": {
        "description": "Lists the Pages a Custom Parable registers in code, from its entry in this Workspace's Parable directory. A composed Parable returns an empty list.",
        "operationId": "ParableDirectoryWorkspaceParableDirectoryPagesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableDirectoryPageResultView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List the Pages in the Parable directory",
        "tags": [
          "parable-directory"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.directory.workspace-parable-directory-pages",
          "description": "Lists the Pages a Custom Parable registers in code, from its entry in this Workspace's Parable directory. A composed Parable returns an empty list.",
          "doNotUseWhen": "Do not use this operation for a composed Parable's Pages: it returns none, because they are Pieces; read them with Read a Parable's contents. Do not use it to search directory entries or read the entry summary.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Check the root ref ID and Workspace context.",
              "description": "The directory entry does not exist in this Workspace."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or manage permission.",
              "description": "The caller cannot view or manage Parables in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Pages for the requested directory entry in this Workspace.",
          "title": "List the Pages in the Parable directory",
          "useWhen": "List the Pages a Custom Parable registers in code, for one Workspace Parable directory entry.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/milestone-delegations": {
      "post": {
        "description": "Sends a request for help connecting data, and emails everyone you name. People already in the Workspace get a direct link to the right Providers page; everyone else gets an invitation first.",
        "operationId": "ParablesMilestoneDelegationsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMilestoneDelegationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MilestoneDelegationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Ask someone else to connect the data",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.definitions.milestone-delegations",
          "description": "Sends a request for help connecting data, and emails everyone you name. People already in the Workspace get a direct link to the right Providers page; everyone else gets an invitation first.",
          "doNotUseWhen": "Do not use this operation to connect a Provider yourself or change an existing request.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Add at least one recipient and one required or selected milestone.",
              "description": "The request has no recipients or no milestones to request."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Check the Parable definition ID.",
              "description": "The requested Parable definition was not found."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with milestone-delegation create or admin connector permission.",
              "description": "The caller cannot create data-connection requests in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Creates a pending data-connection request and records the people invited to help.",
          "title": "Ask someone else to connect the data",
          "useWhen": "Ask named people to connect the data needed for a Parable milestone.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/plots/dependencies": {
      "post": {
        "description": "Atomically replaces the complete dependency set for one draft or sealed Plot scope. The caller must provide the full desired set.",
        "operationId": "ParablesReplaceParablePlotDependenciesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplaceParablePlotDependenciesInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReplaceParablePlotDependenciesResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Replace Plot dependencies",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "parables.published-plots.replace-dependencies",
          "description": "Atomically replaces the complete dependency set for one draft or sealed Plot scope. The caller must provide the full desired set.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Replace Plot dependencies",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/plots/published": {
      "get": {
        "description": "Lists the published Plots available in this Workspace. Drafts, hidden publications, deleted Plots, and Plots with no published SQL are left out.",
        "operationId": "ParablesPublishedPlotsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "parable",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/PublishedParablePlot"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List published Plots",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "parables.published-plots.list",
          "description": "Lists the published Plots available in this Workspace. Drafts, hidden publications, deleted Plots, and Plots with no published SQL are left out.",
          "doNotUseWhen": "Do not use this operation to preview a Plot query or read one Plot by ID.",
          "errors": [
            {
              "code": "WA-RS-003",
              "commonCorrection": "Contact support to page the published Parables.",
              "description": "This Workspace has too many published Parables to resolve the Plot list."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or data catalog permission.",
              "description": "The caller cannot view Parables or the data catalog in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the visible published Plots with their published SQL and run metadata.",
          "title": "List published Plots",
          "useWhen": "List the published Plot queries available to this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/plots/published/output-schema": {
      "post": {
        "description": "Stores the result schema produced for one exact sealed Plot publication. The service rejects stale publications and concurrent replacements.",
        "operationId": "ParablesWritePublishedPlotSchemaHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WritePublishedPlotSchemaInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WritePublishedPlotSchemaResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Write a published Plot schema",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "parables.published-plots.write-schema",
          "description": "Stores the result schema produced for one exact sealed Plot publication. The service rejects stale publications and concurrent replacements.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Write a published Plot schema",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/plots/published/run-summary": {
      "post": {
        "description": "Applies one terminal query Run outcome to the Workspace projection for a published Plot. Older Run or source timestamps are rejected.",
        "operationId": "ParablesApplyPublishedPlotRunSummaryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyPublishedPlotRunSummaryInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ApplyPublishedPlotRunSummaryResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Apply a published Plot Run summary",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "parables.published-plots.apply-run-summary",
          "description": "Applies one terminal query Run outcome to the Workspace projection for a published Plot. Older Run or source timestamps are rejected.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Apply a published Plot Run summary",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/plots/{plotId}/published": {
      "get": {
        "description": "Returns one Plot from the published Parable this Workspace has. Plots that are still drafts, hidden, unpublished, or ambiguous read as not found.",
        "operationId": "ParablesPublishedPlotHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "plotId parameter",
            "in": "path",
            "name": "plotId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PublishedParablePlot"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a published Plot",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "parables.published-plots.get",
          "description": "Returns one Plot from the published Parable this Workspace has. Plots that are still drafts, hidden, unpublished, or ambiguous read as not found.",
          "doNotUseWhen": "Do not use this operation to preview the query or list every published Plot.",
          "errors": [
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the Plot ID and confirm it is published for this Workspace.",
              "description": "The Plot is unknown, unpublished, hidden, ambiguous, or has no published SQL."
            },
            {
              "code": "WA-RS-003",
              "commonCorrection": "Contact support to page the published Parables.",
              "description": "This Workspace has too many published Parables to resolve the Plot."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Parable view or data catalog permission.",
              "description": "The caller cannot view Parables or the data catalog in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the requested visible published Plot.",
          "title": "Read a published Plot",
          "useWhen": "Read one published Plot query and its current published metadata.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/ponder/actors": {
      "get": {
        "description": "Searches the people in this Workspace that you are allowed to mention, and says for each one whether mentioning them would first need them to be given access.",
        "operationId": "ParableProblemSearchPonderWorkspaceActorsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "search",
            "required": true,
            "schema": {
              "maxLength": 200,
              "minLength": 1,
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderWorkspaceActorSearchPageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Find someone to mention",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.mentions.actors.search",
          "description": "Searches the people in this Workspace that you are allowed to mention, and says for each one whether mentioning them would first need them to be given access.",
          "doNotUseWhen": "Do not use when you need to create a mention plan or send a Ping.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Provide a valid Problem identifier and non-empty search text.",
              "description": "The Problem identifier or search text is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Problem you can access.",
              "description": "The Problem does not exist or is not accessible."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns matching mentionable people with their access requirements.",
          "title": "Find someone to mention",
          "useWhen": "Use when you need people you can mention from a known Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/ponder/chat-models": {
      "get": {
        "description": "Lists the models a person can pick for Ponder chat in this Workspace, Ponder first and then every other model in the order the picker offers them. Each entry names its server as Parable, says whether this Workspace can use it now, and lists the model's effort levels, speed modes and prices. A reader with tenant.ai.manage also gets the entries a Workspace admin hid, marked hidden; everyone else gets only the entries that are not hidden.",
        "operationId": "ParableProblemListPonderChatModelsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderChatModelListView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Ponder chat models",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.chat-models.list",
          "description": "Lists the models a person can pick for Ponder chat in this Workspace, Ponder first and then every other model in the order the picker offers them. Each entry names its server as Parable, says whether this Workspace can use it now, and lists the model's effort levels, speed modes and prices. A reader with tenant.ai.manage also gets the entries a Workspace admin hid, marked hidden; everyone else gets only the entries that are not hidden.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "List Ponder chat models",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/ponder/chat-models/order": {
      "post": {
        "description": "Replaces the order in which this Workspace's model picker offers Ponder chat models, and which entries it hides. The list order is the offer order; Ponder always stays first and cannot be hidden. Entries the list leaves out follow in the default order. Returns the model list as the picker now shows it.",
        "operationId": "ParableProblemSetPonderChatModelOrderHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPonderChatModelOrderInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderChatModelListView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set the Ponder chat model order",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.chat-models.order.update",
          "description": "Replaces the order in which this Workspace's model picker offers Ponder chat models, and which entries it hides. The list order is the offer order; Ponder always stays first and cannot be hidden. Entries the list leaves out follow in the default order. Returns the model list as the picker now shows it.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Set the Ponder chat model order",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/ponder/power-tools": {
      "get": {
        "description": "Returns every non-hidden generated tool Ponder may use, each marked with whether this Power uses it, whether it is Required, and the Workspace policy that governs it. A Power uses the built-in defaults with the Workspace additions and removals applied; omit the Power to list the catalog for a Power that is not saved yet. Tool input schemas are not included.",
        "operationId": "ParableProblemListPonderPowerToolsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "powerId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderPowerToolsView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List a Power's tools",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.powers.tools.list",
          "description": "Returns every non-hidden generated tool Ponder may use, each marked with whether this Power uses it, whether it is Required, and the Workspace policy that governs it. A Power uses the built-in defaults with the Workspace additions and removals applied; omit the Power to list the catalog for a Power that is not saved yet. Tool input schemas are not included.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List a Power's tools",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/ponder/powers/{powerId}/tools": {
      "put": {
        "description": "Replaces the set of tools one Power uses. The server stores the set as additions and removals over the built-in defaults, so tools a platform update adds to a built-in Power still arrive. Required tools cannot be removed, an unknown or hidden tool is refused, and a save over a change made since the editor loaded the Power is refused with a conflict. Ponder may use a tool only while at least one Power uses it.",
        "operationId": "ParableProblemSetPonderPowerToolsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "powerId parameter",
            "in": "path",
            "name": "powerId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPonderPowerToolsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderPowerToolsView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set a Power's tools",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.powers.tools.update",
          "description": "Replaces the set of tools one Power uses. The server stores the set as additions and removals over the built-in defaults, so tools a platform update adds to a built-in Power still arrive. Required tools cannot be removed, an unknown or hidden tool is refused, and a save over a change made since the editor loaded the Power is refused with a conflict. Ponder may use a tool only while at least one Power uses it.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Set a Power's tools",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/ponder/tool-policy": {
      "put": {
        "description": "Sets or removes the Workspace default for one non-hidden generated tool. Human API permissions remain authoritative.",
        "operationId": "ParableProblemSetPonderWorkspaceToolPolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPonderWorkspaceToolPolicyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderToolPolicyMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set a Workspace tool permission default",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.workspace-tool-policies.update",
          "description": "Sets or removes the Workspace default for one non-hidden generated tool. Human API permissions remain authoritative.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Set a Workspace tool permission default",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/primaries/{rootRefId}/collaboration-mode": {
      "put": {
        "description": "Chooses how a Parable is edited. In Personal mode you edit it directly and nobody else takes part. In Publishing mode edits go into Changes that are submitted, published, and kept as Versions. Switching to Publishing opens no Changes. A set starts at a person's first change, at Start Changes, or at an edit in a Ponder turn. The answer names Pending Changes that you already hold. Switching back to Personal keeps the content and the Version history, removes the other participants, and pockets any open Changes. Only the Parable's Primary can change this.",
        "operationId": "ParableAuthoringSetWorkspaceParableCollaborationModeHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetParableCollaborationModeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SetParableCollaborationModeResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Switch Collaboration mode between Personal and Publishing",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.collaboration.mode",
          "description": "Chooses how a Parable is edited. In Personal mode you edit it directly and nobody else takes part. In Publishing mode edits go into Changes that are submitted, published, and kept as Versions. Switching to Publishing opens no Changes. A set starts at a person's first change, at Start Changes, or at an edit in a Ponder turn. The answer names Pending Changes that you already hold. Switching back to Personal keeps the content and the Version history, removes the other participants, and pockets any open Changes. Only the Parable's Primary can change this.",
          "doNotUseWhen": "Do not use this operation to edit a Piece or publish Changes.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and Workspace context.",
              "description": "The Parable was not found in the current Workspace."
            },
            {
              "code": "PA-AU-003",
              "commonCorrection": "Read current status and retry with the latest revisions.",
              "description": "The Parable aggregate or root revision is stale."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read current status and choose a supported transition.",
              "description": "The requested mode change is not valid for the current state."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required RACI role.",
              "description": "The caller cannot change collaboration mode."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedAggregateRevision",
              "/expectedRootRefVersion"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Updates the collaboration mode and returns the resulting state.",
          "title": "Switch Collaboration mode between Personal and Publishing",
          "useWhen": "Choose how a Workspace Parable is edited: Personal or Publishing mode.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problem-graph": {
      "get": {
        "description": "Returns the map of Problems in this Workspace and how they relate to each other. Contexts, relationships and who is present are only filled in for Problems you can fully see.",
        "operationId": "ParableProblemListParableProblemGraphHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "explode": false,
            "in": "query",
            "name": "stage",
            "required": false,
            "schema": {
              "items": {
                "$ref": "#/components/schemas/ParableProblemStageEnum"
              },
              "maxItems": 100,
              "minItems": 0,
              "type": "array"
            },
            "style": "form"
          },
          {
            "explode": false,
            "in": "query",
            "name": "resolution",
            "required": false,
            "schema": {
              "items": {
                "$ref": "#/components/schemas/ParableProblemResolutionStatusEnum"
              },
              "maxItems": 100,
              "minItems": 0,
              "type": "array"
            },
            "style": "form"
          },
          {
            "in": "query",
            "name": "lifecycle",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ParableProblemLifecycleEnum"
            }
          },
          {
            "explode": false,
            "in": "query",
            "name": "responsibilityRole",
            "required": false,
            "schema": {
              "items": {
                "$ref": "#/components/schemas/ParableRaciRoleEnum"
              },
              "maxItems": 100,
              "minItems": 0,
              "type": "array"
            },
            "style": "form"
          },
          {
            "in": "query",
            "name": "contextParableId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "includePocketed",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "maximum": 100,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemGraphPageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "See how Problems connect",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-graph.list",
          "description": "Returns the map of Problems in this Workspace and how they relate to each other. Contexts, relationships and who is present are only filled in for Problems you can fully see.",
          "doNotUseWhen": "Do not use when you need the full history and details of one known Problem.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use valid filters and restart from the first page if the cursor no longer matches.",
              "description": "The filters or cursor are invalid for this Problem graph."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you can view Parables.",
              "description": "You cannot view Parables in this Workspace."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns a filtered page of Problem graph nodes and relationships.",
          "title": "See how Problems connect",
          "useWhen": "Use when you need to understand how Problems relate across the Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problem-ping-inbox": {
      "get": {
        "description": "Lists the Pings addressed to you. They deliberately say nothing about where they came from, and receiving one gives you no access to the Problem behind it.",
        "operationId": "ParableProblemListParableProblemPingInboxHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "readState",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ParableProblemPingReadStateEnum"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingInboxPageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List your Ping inbox",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-pings.inbox.list",
          "description": "Lists the Pings addressed to you. They deliberately say nothing about where they came from, and receiving one gives you no access to the Problem behind it.",
          "doNotUseWhen": "Do not use when you need Pings sent from a specific Problem.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns your Ping inbox page.",
          "title": "List your Ping inbox",
          "useWhen": "Use when you need the Pings addressed to you and their response state.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problem-ping-inbox/{inboxItemId}/actions/read": {
      "post": {
        "description": "Records that you have read a Ping in your inbox, without opening the Problem behind it.",
        "operationId": "ParableProblemMarkParableProblemPingReadHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "inboxItemId parameter",
            "in": "path",
            "name": "inboxItemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkParableProblemPingReadInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingReadReceiptView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Mark a Ping as read",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-pings.inbox.read",
          "description": "Records that you have read a Ping in your inbox, without opening the Problem behind it.",
          "doNotUseWhen": "Do not use when you need to answer a Ping or open its Problem.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Ping inbox item and read input.",
              "description": "The inbox item or read input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Ping addressed to you in a Workspace where you have Ponder access.",
              "description": "You cannot read this Ping inbox item."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the inbox item and retry with its current revision.",
              "description": "The inbox item changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedInboxItemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Ping read receipt.",
          "title": "Mark a Ping as read",
          "useWhen": "Use when you need to record that you read one received Ping.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problem-ping-inbox/{inboxItemId}/actions/respond": {
      "post": {
        "description": "Answers a Ping that asked you to weigh in. Answering gives you no access to the Problem behind it, and Pings that were only for awareness cannot be answered. An answer to a question a Ponder Run asked wakes that Run; once the Run stopped at its deadline, the answer is refused with WA-PR-009.",
        "operationId": "ParableProblemRespondToParableProblemPingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "inboxItemId parameter",
            "in": "path",
            "name": "inboxItemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RespondToParableProblemPingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingInboxItemView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Answer a Ping",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-pings.inbox.respond",
          "description": "Answers a Ping that asked you to weigh in. Answering gives you no access to the Problem behind it, and Pings that were only for awareness cannot be answered. An answer to a question a Ponder Run asked wakes that Run; once the Run stopped at its deadline, the answer is refused with WA-PR-009.",
          "doNotUseWhen": "Do not use when the Ping is only for awareness or you only need to mark it read.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid response-request Ping and response input.",
              "description": "The inbox item or response input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Ping addressed to you in a Workspace where you have Ponder access.",
              "description": "You cannot respond to this Ping inbox item."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the inbox item and retry with its current revision.",
              "description": "The inbox item changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedInboxItemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the updated Ping inbox item and response state.",
          "title": "Answer a Ping",
          "useWhen": "Use when you need to answer a received Ping that asks for a response.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problem-relationship-types": {
      "get": {
        "description": "Lists the kinds of link that can be drawn between Problems — which direction each one runs, what its opposite is called, and what a link of that kind has to contain.",
        "operationId": "ParableProblemListParableProblemRelationshipTypesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRelationshipTypePageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List the ways Problems can relate",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-relationship-types.list",
          "description": "Lists the kinds of link that can be drawn between Problems — which direction each one runs, what its opposite is called, and what a link of that kind has to contain.",
          "doNotUseWhen": "Do not use when you need the existing relationships between specific Problems.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you can view Parables.",
              "description": "You cannot view Parables in this Workspace."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the available Problem relationship types.",
          "title": "List the ways Problems can relate",
          "useWhen": "Use when you need the allowed relationship types before describing a link between Problems.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problem-tree": {
      "get": {
        "description": "Returns every Problem of one Parable you can see, as one tree: the Parable's root Problem, then each Problem under its parent. Each Problem says where it stands, who started it and who is on its thread. The people it names come with their seat on the Parable, so a reader can filter by person without another read. Their Workspace Roles come only to a reader who may view the Workspace's members. A Problem whose parent you cannot see names no parent. A Problem that the root cannot reach, such as one with no parent, comes under the root. Problems in the Pocket are left out unless you ask for them. A Pocketed Problem still comes back while it holds Changes that are not published. It also comes back when a Problem you can see sits under it, so the tree stays connected.",
        "operationId": "ParableProblemGetParableProblemTreeHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "includePocketed",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemTreeView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the Problem tree",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.tree",
          "description": "Returns every Problem of one Parable you can see, as one tree: the Parable's root Problem, then each Problem under its parent. Each Problem says where it stands, who started it and who is on its thread. The people it names come with their seat on the Parable, so a reader can filter by person without another read. Their Workspace Roles come only to a reader who may view the Workspace's members. A Problem whose parent you cannot see names no parent. A Problem that the root cannot reach, such as one with no parent, comes under the root. Problems in the Pocket are left out unless you ask for them. A Pocketed Problem still comes back while it holds Changes that are not published. It also comes back when a Problem you can see sits under it, so the tree stays connected.",
          "doNotUseWhen": "Do not use when you need to search Problems page by page. Use find_problems for that.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Parable you can access.",
              "description": "The Parable does not exist or is not accessible."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Problems you can see under the Parable, parents first, at most 500.",
          "title": "Read the Problem tree",
          "useWhen": "Use when you need to show or filter all the Problems of one Parable at once.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems": {
      "get": {
        "description": "Searches the Problems you can see under one Parable. Problems in the Pocket are left out unless you ask for them. Each row names its state, the set of Changes it holds, and its parent when you can see the parent.",
        "operationId": "ParableProblemListParableProblemsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "includePocketed",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "maximum": 100,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Find Problems",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.list",
          "description": "Searches the Problems you can see under one Parable. Problems in the Pocket are left out unless you ask for them. Each row names its state, the set of Changes it holds, and its parent when you can see the parent.",
          "doNotUseWhen": "Do not use when you already know the Problem you need to open.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use an integer limit from 1 to 100.",
              "description": "The Problem page limit is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Parable you can access.",
              "description": "The Parable does not exist or is not accessible."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns an authorized page of Problems under the Parable.",
          "title": "Find Problems",
          "useWhen": "Use when you need to browse or search Problems under one Parable.",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Creates a new Problem, a thread of conversation in this Workspace, under a parent Problem of the same Parable. A Parable's Problems form one tree: its root Problem is made with the Parable, and nothing else starts at the top. Every new Problem needs a name, a one- or two-sentence description of the outcome it is for, and an icon. Inside a Ponder turn, a Problem with no parent goes under the turn's own Problem.",
        "operationId": "ParableProblemCreateParableProblemHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateParableProblemInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemDefinition"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Start a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.create",
          "description": "Creates a new Problem, a thread of conversation in this Workspace, under a parent Problem of the same Parable. A Parable's Problems form one tree: its root Problem is made with the Parable, and nothing else starts at the top. Every new Problem needs a name, a one- or two-sentence description of the outcome it is for, and an icon. Inside a Ponder turn, a Problem with no parent goes under the turn's own Problem.",
          "doNotUseWhen": "Do not use when you need to send a message to an existing Problem.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Give the Problem a name of at most 120 characters, a description of at most 2,000, and an icon. Name a parent Problem in the same Parable.",
              "description": "The Problem input is invalid. The name or description is blank or too long, or the icon is missing. Or the input names no parent outside a Ponder turn, or a parent in another Parable."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a parent Problem you can open.",
              "description": "The parent Problem does not exist, or you cannot see it."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Take the parent Problem out of the Pocket first, or name a parent Problem of a Parable. When Problem parents are switched off, ask Parable staff to make the Parent relationship type active again.",
              "description": "The parent Problem is in the Pocket, or it belongs to no Parable, such as an older Workspace Problem. Or Problem parents are switched off in the Workspace's catalog. Inside a Ponder turn with no parentProblemId, the current Problem is the parent."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the new Problem definition, with its Parent relationship.",
          "title": "Start a Problem",
          "useWhen": "Use when work needs its own thread: a separate outcome, owner or review path under an existing Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}": {
      "get": {
        "description": "Returns a Problem with its most recent messages, a cursor for reading further back, and its Runs, Pings, Possibilities and anything waiting on approval.",
        "operationId": "ParableProblemGetParableProblemHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemDetailView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Open a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.get",
          "description": "Returns a Problem with its most recent messages, a cursor for reading further back, and its Runs, Pings, Possibilities and anything waiting on approval.",
          "doNotUseWhen": "Do not use when you need to browse Problems under a Parable.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Problem you can access.",
              "description": "The Problem does not exist or is not accessible."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the requested Problem and its current detail view.",
          "title": "Open a Problem",
          "useWhen": "Use when you need the current details, activity, and state of one known Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/actions/pocket": {
      "post": {
        "description": "Puts a Problem away without deleting it. Its messages, Runs and context are all kept, and no new Runs can start until it is taken back out. A Parable's root Problem cannot go in the Pocket: it stays open while the Parable exists.",
        "operationId": "ParableProblemPocketParableProblemHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeParableProblemLifecycleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemLifecycleMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Pocket a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.pocket",
          "description": "Puts a Problem away without deleting it. Its messages, Runs and context are all kept, and no new Runs can start until it is taken back out. A Parable's root Problem cannot go in the Pocket: it stays open while the Parable exists.",
          "doNotUseWhen": "Do not use when you need to cancel one active Run.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Problem identifier and lifecycle input.",
              "description": "The Problem identifier or lifecycle input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access. To Pocket a Problem someone else started, ask its starter or someone in Primary or Publishing.",
              "description": "You cannot change this Problem. Only the person who started it, or someone in Primary or Publishing on its Parable, can put it in the Pocket."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision. For the root Problem, Pocket a Problem under it instead.",
              "description": "The Problem changed after the expected revision, or it is a Parable's root Problem, which stays open while the Parable exists."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Problem lifecycle update.",
          "title": "Pocket a Problem",
          "useWhen": "Use when you need to pause a Problem without deleting its history.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/actions/restore": {
      "post": {
        "description": "Brings a pocketed Problem back into normal use with all its history, so new Runs can start on it again.",
        "operationId": "ParableProblemRestoreParableProblemHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeParableProblemLifecycleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemLifecycleMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Take a Problem out of the Pocket",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.restore",
          "description": "Brings a pocketed Problem back into normal use with all its history, so new Runs can start on it again.",
          "doNotUseWhen": "Do not use when you need to start a Run without changing the Problem lifecycle.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Problem identifier and lifecycle input.",
              "description": "The Problem identifier or lifecycle input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access. To restore a Problem someone else started, ask its starter or someone in Primary or Publishing.",
              "description": "You cannot change this Problem. Only the person who started it, or someone in Primary or Publishing on its Parable, can take it out of the Pocket."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Problem lifecycle update.",
          "title": "Take a Problem out of the Pocket",
          "useWhen": "Use when you need to resume a pocketed Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/contexts": {
      "post": {
        "description": "Adds an optional reference to a Parable, Version, set of Changes, or Piece. It does not grant access or restrict unrelated tools to that target. Existing Messages are untouched.",
        "operationId": "ParableProblemAttachParableProblemContextHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AttachParableProblemContextInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemContextMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Attach context to a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.context.attach",
          "description": "Adds an optional reference to a Parable, Version, set of Changes, or Piece. It does not grant access or restrict unrelated tools to that target. Existing Messages are untouched.",
          "doNotUseWhen": "Do not use when you need to change Problem responsibilities or links.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use valid identifiers and an accessible context target.",
              "description": "The Problem or context input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Problem and context target you can access.",
              "description": "You cannot attach that context to this Problem."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Problem context update.",
          "title": "Attach context to a Problem",
          "useWhen": "Use when you need to add one Parable, Version, Changes, or Piece reference to a Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/contexts/{contextLinkId}/actions/retire": {
      "post": {
        "description": "Stops a piece of context applying from now on, while keeping it on record so older messages still make sense. Nothing is deleted.",
        "operationId": "ParableProblemRetireParableProblemContextHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "contextLinkId parameter",
            "in": "path",
            "name": "contextLinkId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetireParableProblemContextInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemContextMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Remove context from a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.context.retire",
          "description": "Stops a piece of context applying from now on, while keeping it on record so older messages still make sense. Nothing is deleted.",
          "doNotUseWhen": "Do not use when you need to delete a Problem or its history.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use valid identifiers and retire input.",
              "description": "The Problem, context link, or retire input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Problem you can access.",
              "description": "You cannot change this Problem context."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Problem context update.",
          "title": "Remove context from a Problem",
          "useWhen": "Use when you need to stop one existing context link from applying to a Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/mention-plans": {
      "post": {
        "description": "Builds an idempotent confirmation plan for mentioning an actor, including any personal-to-published transition, Peeking access, and notification. It performs no write; a new Message consumes the confirmed plan atomically.",
        "operationId": "ParableProblemPlanParableProblemMentionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlanParableProblemMentionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemMentionAccessPlanView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Plan a Problem mention",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.mentions.plan",
          "description": "Builds an idempotent confirmation plan for mentioning an actor, including any personal-to-published transition, Peeking access, and notification. It performs no write; a new Message consumes the confirmed plan atomically.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "title": "Plan a Problem mention",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/messages": {
      "get": {
        "description": "Returns one bounded chronological page of authorized Problem Messages. With no cursor it returns the newest page; beforeSequence is an exclusive cursor that continues toward older history.",
        "operationId": "ParableProblemListParableProblemMessagesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "beforeSequence",
            "required": false,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "maximum": 100,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemMessagePageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Problem Messages",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-messages.list",
          "description": "Returns one bounded chronological page of authorized Problem Messages. With no cursor it returns the newest page; beforeSequence is an exclusive cursor that continues toward older history.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List Problem Messages",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Posts one message to a Problem without asking Ponder to reply. Mentions, any access they grant, Pings and notifications all land together with the message or not at all.",
        "operationId": "ParableProblemAppendParableProblemMessageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppendParableProblemMessageInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AppendParableProblemMessageResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Send a message in a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-messages.append",
          "description": "Posts one message to a Problem without asking Ponder to reply. Mentions, any access they grant, Pings and notifications all land together with the message or not at all.",
          "doNotUseWhen": "Do not use when you need Ponder to work on the message immediately.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Problem and message input.",
              "description": "The Problem or message input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Problem you can access.",
              "description": "You cannot post to this Problem."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/message/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the posted message and any committed mention effects.",
          "title": "Send a message in a Problem",
          "useWhen": "Use when you need to post a message without starting a Ponder Run.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/pings": {
      "get": {
        "description": "Lists the Pings sent from one Problem you can see. This is the sender's view; it is never what decides whether somebody may read their own inbox.",
        "operationId": "ParableProblemListParableProblemPingsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingPageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Pings sent about a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-pings.list",
          "description": "Lists the Pings sent from one Problem you can see. This is the sender's view; it is never what decides whether somebody may read their own inbox.",
          "doNotUseWhen": "Do not use when you need the Pings addressed to you personally.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Problem you can access.",
              "description": "The Problem does not exist or is not accessible."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns a page of Pings sent from the Problem.",
          "title": "List Pings sent about a Problem",
          "useWhen": "Use when you need the Pings sent from one known Problem.",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Sends a Ping asking people either to weigh in or just to be aware. Pinging someone does not give them access to the Problem itself.",
        "operationId": "ParableProblemCreateParableProblemPingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateParableProblemPingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Ping people about a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-pings.create",
          "description": "Sends a Ping asking people either to weigh in or just to be aware. Pinging someone does not give them access to the Problem itself.",
          "doNotUseWhen": "Do not use when you need to answer a Ping you received.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use valid recipients and Ping input.",
              "description": "The Problem or Ping input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Problem you can access.",
              "description": "You cannot create a Ping for this Problem."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the new Problem Ping and recipients.",
          "title": "Ping people about a Problem",
          "useWhen": "Use when you need to send a Ping from a Problem to selected people.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/pings/{pingId}": {
      "get": {
        "description": "Returns one Ping you sent, who it went to and how they answered, once your access to the Problem behind it is confirmed.",
        "operationId": "ParableProblemGetParableProblemPingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "pingId parameter",
            "in": "path",
            "name": "pingId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Ping you sent",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-pings.get",
          "description": "Returns one Ping you sent, who it went to and how they answered, once your access to the Problem behind it is confirmed.",
          "doNotUseWhen": "Do not use when you need your own Ping inbox.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Ping from a Problem you can access.",
              "description": "The Problem or Ping does not exist or is not accessible."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the requested Ping and its responses.",
          "title": "Read a Ping you sent",
          "useWhen": "Use when you need the recipients and responses for one known Ping you sent.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/pings/{pingId}/actions/answer": {
      "post": {
        "description": "Records one person’s answers to the questions a Ping asks, inside the Problem that asked them. Answering requires Pinging participation on that Problem; Peeking sight shows the questions and never accepts an answer. A permitted person who was not addressed becomes a recipient by answering, which is how a colleague joins a question already asked of someone else. An answer to a question a Ponder Run asked wakes that Run; once the Run stopped at its deadline, the answer is refused with WA-PR-009.",
        "operationId": "ParableProblemAnswerParableProblemPingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "pingId parameter",
            "in": "path",
            "name": "pingId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnswerParableProblemPingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Answer a Problem Ping",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-pings.answer",
          "description": "Records one person’s answers to the questions a Ping asks, inside the Problem that asked them. Answering requires Pinging participation on that Problem; Peeking sight shows the questions and never accepts an answer. A permitted person who was not addressed becomes a recipient by answering, which is how a colleague joins a question already asked of someone else. An answer to a question a Ponder Run asked wakes that Run; once the Run stopped at its deadline, the answer is refused with WA-PR-009.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedPingRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "title": "Answer a Problem Ping",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/pings/{pingId}/actions/close": {
      "post": {
        "description": "Closes a Ping you sent. What recipients already received, read or answered is left as it was.",
        "operationId": "ParableProblemCloseParableProblemPingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "pingId parameter",
            "in": "path",
            "name": "pingId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloseParableProblemPingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPingView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Close a Ping",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-pings.close",
          "description": "Closes a Ping you sent. What recipients already received, read or answered is left as it was.",
          "doNotUseWhen": "Do not use when you need to mark a received Ping as read.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use valid identifiers and close input.",
              "description": "The Problem, Ping, or close input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Ping you sent from a Problem you can access.",
              "description": "You cannot close this Ping."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Ping and retry with its current revision.",
              "description": "The Ping changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedPingRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the closed Ping.",
          "title": "Close a Ping",
          "useWhen": "Use when you need to close a Ping that you sent from a Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/pinned-pages/actions/pin": {
      "post": {
        "description": "Shows a Page as a tab in Ponder for everyone in the Problem, after the Parable's home Page. Choosing the tab renders the live Page above the chat whenever the editor is hidden. Pinning a Page that is already pinned changes nothing.",
        "operationId": "ParableProblemPinParableProblemPageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeParableProblemPinnedPageInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPinnedPagesMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Pin a Page to Ponder",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.pages.pin",
          "description": "Shows a Page as a tab in Ponder for everyone in the Problem, after the Parable's home Page. Choosing the tab renders the live Page above the chat whenever the editor is hidden. Pinning a Page that is already pinned changes nothing.",
          "doNotUseWhen": "Do not use to show a picture of a Pane in a Message; use previewPane for that.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use the id of a Page in the Parable this Problem is about.",
              "description": "The Problem or Page identifier is invalid, or the Problem already has 24 pinned Pages."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Problem."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Open a Problem you can see.",
              "description": "The Problem is not visible to you."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns every Page pinned to the Problem and the Problem revision.",
          "title": "Pin a Page to Ponder",
          "useWhen": "Use when a Page should stay one click away in this Problem's chat, for example the Page a conversation keeps returning to or one you just built.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/pinned-pages/actions/unpin": {
      "post": {
        "description": "Removes a pinned Page's tab from Ponder for everyone in the Problem. The Parable's home Page is never pinned and always stays. Unpinning a Page that is not pinned changes nothing.",
        "operationId": "ParableProblemUnpinParableProblemPageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeParableProblemPinnedPageInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemPinnedPagesMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Unpin a Page from Ponder",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.pages.unpin",
          "description": "Removes a pinned Page's tab from Ponder for everyone in the Problem. The Parable's home Page is never pinned and always stays. Unpinning a Page that is not pinned changes nothing.",
          "doNotUseWhen": "Do not use to delete or archive the Page itself.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use the id of a Page pinned to this Problem.",
              "description": "The Problem or Page identifier is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Problem."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Open a Problem you can see.",
              "description": "The Problem is not visible to you."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns every Page still pinned to the Problem and the Problem revision.",
          "title": "Unpin a Page from Ponder",
          "useWhen": "Use when a pinned Page is no longer useful in this Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/possibilities": {
      "post": {
        "description": "Records one option under a Ping that asked people to weigh in, with its Pros and Cons in order and who should decide.",
        "operationId": "ParableProblemCreateParablePossibilityHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateParablePossibilityInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CreateParablePossibilityResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Record a Possibility",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-possibilities.create",
          "description": "Records one option under a Ping that asked people to weigh in, with its Pros and Cons in order and who should decide.",
          "doNotUseWhen": "Do not use when you need to send or answer a Ping.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Problem, Ping, and Possibility input.",
              "description": "The Problem or Possibility input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Problem."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the new Possibility and its Problem update.",
          "title": "Record a Possibility",
          "useWhen": "Use when you need to record one decision option under a Problem Ping.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/proofs": {
      "post": {
        "description": "Records evidence for a Problem — a Picture, People, a Ponder Run, or a Plot. Evidence from a Ponder Run is taken from the Run itself, never from whatever the browser claims.",
        "operationId": "ParableProblemCreateParableProblemProofHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateParableProblemProofInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CreateParableProblemProofResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Add a Proof to a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-proofs.create",
          "description": "Records evidence for a Problem — a Picture, People, a Ponder Run, or a Plot. Evidence from a Ponder Run is taken from the Run itself, never from whatever the browser claims.",
          "doNotUseWhen": "Do not use when you need to record a judgement on existing evidence.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Problem and Proof input.",
              "description": "The Problem or Proof input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Problem."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the new Proof and its Problem update.",
          "title": "Add a Proof to a Problem",
          "useWhen": "Use when you need to add evidence to one Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/proofs/{proofId}/evaluations": {
      "post": {
        "description": "Records a judgement on a Proof and works out again whether the Problem is resolved. Nothing already recorded is rewritten.",
        "operationId": "ParableProblemRecordParableProofEvaluationHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "proofId parameter",
            "in": "path",
            "name": "proofId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordParableProofEvaluationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RecordParableProofEvaluationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Judge a Proof",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-proofs.evaluate",
          "description": "Records a judgement on a Proof and works out again whether the Problem is resolved. Nothing already recorded is rewritten.",
          "doNotUseWhen": "Do not use when you need to add new evidence to a Problem.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use valid identifiers and evaluation input.",
              "description": "The Problem, Proof, or evaluation input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Problem."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Proof evaluation and updated Problem resolution.",
          "title": "Judge a Proof",
          "useWhen": "Use when you need to record a judgement on one existing Proof.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/relationships": {
      "put": {
        "description": "Replaces the whole set of links from one Problem to others — parent, blocks, and runs-alongside — in a single step. A Parable's Problems form one tree. Every Problem but the Parable's root keeps exactly one parent in the same Parable, and the root has none. A new parent cannot be in the Pocket. Moving a Problem moves everything under it. Linking changes nobody's access.",
        "operationId": "ParableProblemReplaceParableProblemRelationshipsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplaceParableProblemRelationshipsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemCollaborationMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Link Problems together",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.relationships.replace",
          "description": "Replaces the whole set of links from one Problem to others — parent, blocks, and runs-alongside — in a single step. A Parable's Problems form one tree. Every Problem but the Parable's root keeps exactly one parent in the same Parable, and the root has none. A new parent cannot be in the Pocket. Moving a Problem moves everything under it. Linking changes nobody's access.",
          "doNotUseWhen": "Do not use when you need to change who is responsible for a Problem.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Keep one parent in the same Parable on every Problem but the root, and none on the root. Move a Problem whose parent is in another Parable under a Problem of its own Parable. Leave out a symmetric link that the other Problem already stores.",
              "description": "The Problem or relationship input is invalid. A Problem below the root has no parent or more than one, or the root has a parent. A parent, new or kept, is in another Parable. Or the links make a cycle, or store a symmetric link that the other Problem already stores."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access. To move a Problem someone else started, ask its starter or someone in Primary or Publishing.",
              "description": "You cannot change this Problem. Only the person who started it, or someone in Primary or Publishing on its Parable, can move it under another parent."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Link only Problems you can open.",
              "description": "The Problem or a related Problem does not exist, or you cannot see it."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry, or take the parent out of the Pocket first.",
              "description": "The Problem changed after the expected revision, or the new parent is in the Pocket."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Problem collaboration update.",
          "title": "Link Problems together",
          "useWhen": "Use when you need to replace the links between one Problem and other Problems.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/responsibilities": {
      "put": {
        "description": "Replaces the whole list of people responsible for a Problem. It changes nothing about the Parable, membership, permissions, or who can read which message.",
        "operationId": "ParableProblemReplaceParableProblemResponsibilitiesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplaceParableProblemResponsibilitiesInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemCollaborationMutationResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set who is responsible for a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problems.responsibilities.replace",
          "description": "Replaces the whole list of people responsible for a Problem. It changes nothing about the Parable, membership, permissions, or who can read which message.",
          "doNotUseWhen": "Do not use when you need to change Workspace membership or permissions.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use valid actor references and responsibility input.",
              "description": "The Problem or responsibility input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Problem."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem and retry with its current revision.",
              "description": "The Problem changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Problem collaboration update.",
          "title": "Set who is responsible for a Problem",
          "useWhen": "Use when you need to replace the people responsible for one Problem.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/runs": {
      "post": {
        "description": "Starts a Run, either on a message that already exists or on a new one you send at the same time. When you send a new message, the message, its mentions, any access they grant, and the Run all commit together or not at all. Problems in the Pocket are refused.",
        "operationId": "ParableProblemStartParableProblemRunHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartParableProblemRunInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/StartParableProblemRunResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Ask Ponder to work on a Problem",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-runs.start",
          "description": "Starts a Run, either on a message that already exists or on a new one you send at the same time. When you send a new message, the message, its mentions, any access they grant, and the Run all commit together or not at all. Problems in the Pocket are refused.",
          "doNotUseWhen": "Do not use when you only need to post a message without a Run.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Problem and Run trigger input.",
              "description": "The Problem, message, or Run input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Problem you can access.",
              "description": "You cannot start a Run on this Problem."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Problem, restore it if needed, and retry with its current revision.",
              "description": "The Problem changed after the expected revision or is pocketed."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedProblemRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the new Problem Run and its initial message state.",
          "title": "Ask Ponder to work on a Problem",
          "useWhen": "Use when you need Ponder to start work on a Problem or one of its messages.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/runs/{runId}": {
      "get": {
        "description": "Returns what happened in one Run: where it got to, which model it used, what it cost, and how it ended. The live token-by-token stream is separate.",
        "operationId": "ParableProblemGetParableProblemRunHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRun"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check on a Run",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-runs.get",
          "description": "Returns what happened in one Run: where it got to, which model it used, what it cost, and how it ended. The live token-by-token stream is separate.",
          "doNotUseWhen": "Do not use when you need the full Problem or its live output stream.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Run from a Problem you can access.",
              "description": "The Problem or Run does not exist or is not accessible."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the requested Problem Run.",
          "title": "Check on a Run",
          "useWhen": "Use when you need the status, model, cost, and outcome of one known Run.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/runs/{runId}/actions/cancel": {
      "post": {
        "description": "Asks a Run in progress to stop. Simply closing the browser or dropping the stream does not cancel anything.",
        "operationId": "ParableProblemCancelParableProblemRunHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CancelParableProblemRunInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRun"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Cancel a Run",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-runs.cancel",
          "description": "Asks a Run in progress to stop. Simply closing the browser or dropping the stream does not cancel anything.",
          "doNotUseWhen": "Do not use when you only need to stop reading the Run stream.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use valid identifiers and cancellation input.",
              "description": "The Problem, Run, or cancellation input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Problem you can access.",
              "description": "You cannot cancel this Run."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Run and retry with its current revision.",
              "description": "The Run changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRunRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Run with its updated cancellation state.",
          "title": "Cancel a Run",
          "useWhen": "Use when you need to request cancellation of one active Problem Run.",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/runs/{runId}/approvals/{approvalId}/actions/decide": {
      "post": {
        "description": "Records one authorized approval decision with optimistic concurrency and idempotency before the executor of the Run is resumed or refused. For a Run the Ponder runner drives, the decision may arrive while the step that asked is still running, and it is raised to the runner after it is recorded; a failed raise leaves the decision recorded for the runner reconciler to raise again.",
        "operationId": "ParableProblemDecideParableProblemRunApprovalHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "approvalId parameter",
            "in": "path",
            "name": "approvalId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DecideParableProblemRunApprovalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRunApproval"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Decide a Run approval",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-runs.approvals.decide",
          "description": "Records one authorized approval decision with optimistic concurrency and idempotency before the executor of the Run is resumed or refused. For a Run the Ponder runner drives, the decision may arrive while the step that asked is still running, and it is raised to the runner after it is recorded; a failed raise leaves the decision recorded for the runner reconciler to raise again.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedApprovalRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "title": "Decide a Run approval",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/runs/{runId}/diagnostics": {
      "get": {
        "description": "Returns the safe employee diagnostic projection for one Run after Admin Ponder, debug-capability, Workspace, and full Problem-context authorization are all rechecked. Credentials, hidden reasoning, and unauthorized payloads are never returned.",
        "operationId": "ParableProblemListParableProblemRunDiagnosticsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRunDiagnosticEventPageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Problem Run diagnostics",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "admin",
          "capability": "ponder.problem-runs.diagnostics.list",
          "description": "Returns the safe employee diagnostic projection for one Run after Admin Ponder, debug-capability, Workspace, and full Problem-context authorization are all rechecked. Credentials, hidden reasoning, and unauthorized payloads are never returned.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List Problem Run diagnostics",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/runs/{runId}/stream-chunks": {
      "get": {
        "description": "Returns one ordered page of the stored public stream parts of a durable Run, from startIndex (default 0), at most limit chunks (default 200, maximum 512), so a browser that reconnects, joins late or reloads can catch up from the last index it applied. A page shorter than the limit is the end of what is stored. Authorization is the same as opening the Run: Workspace membership and Problem RACI are rechecked, and a Run in another Workspace is not found. Pages never contain tool arguments, credentials or provider metadata.",
        "operationId": "ParableProblemListParableProblemRunStreamChunksHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "runId parameter",
            "in": "path",
            "name": "runId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "startIndex",
            "required": false,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "maximum": 512,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableProblemRunStreamChunkPageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Replay a Run stream",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.problem-runs.stream-chunks.list",
          "description": "Returns one ordered page of the stored public stream parts of a durable Run, from startIndex (default 0), at most limit chunks (default 200, maximum 512), so a browser that reconnects, joins late or reloads can catch up from the last index it applied. A page shorter than the limit is the end of what is stored. Authorization is the same as opening the Run: Workspace membership and Problem RACI are rechecked, and a Run in another Workspace is not found. Pages never contain tool arguments, credentials or provider metadata.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Replay a Run stream",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/problems/{problemId}/tool-approvals/{approvalId}/policy": {
      "put": {
        "description": "Commits an Always or Never Workspace default from one pending inline approval. The pending one-call decision remains separate and is not resolved unless this policy write succeeds.",
        "operationId": "ParableProblemRememberPonderToolApprovalPolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "approvalId parameter",
            "in": "path",
            "name": "approvalId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RememberPonderToolApprovalPolicyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderToolApprovalPolicyMemoryResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Remember an inline tool permission",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.tool-approvals.policy.remember",
          "description": "Commits an Always or Never Workspace default from one pending inline approval. The pending one-call decision remains separate and is not resolved unless this policy write succeeds.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Remember an inline tool permission",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/realtime-cursor": {
      "get": {
        "description": "Returns the Workspace's newest realtime fact cursor. A page reads it before its data and opens its realtime connection after it, so the connection replays only what changed since that read instead of asking for a full reload.",
        "operationId": "ParableProblemGetParableRealtimeCursorHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableRealtimeCursorView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the realtime cursor",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.realtime.connect",
          "description": "Returns the Workspace's newest realtime fact cursor. A page reads it before its data and opens its realtime connection after it, so the connection replays only what changed since that read instead of asking for a full reload.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read the realtime cursor",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/realtime-tickets": {
      "post": {
        "description": "Creates a short-lived one-use ticket for the current person and explicitly resolved Workspace. The ticket grants no resource access by itself.",
        "operationId": "ParableProblemCreateParableRealtimeTicketHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateParableRealtimeTicketInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableRealtimeTicketView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Create a realtime ticket",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.realtime.connect",
          "description": "Creates a short-lived one-use ticket for the current person and explicitly resolved Workspace. The ticket grants no resource access by itself.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Create a realtime ticket",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/report-runs/outputs-deleted": {
      "post": {
        "description": "Records that the output tables of the named Plot results of one Report run were deleted. Each result must belong to the run and hold an output that no reader can reach: the run left retention, or it failed or was cancelled. Once no output of an expired run remains, the run records when its outputs were deleted. Repeating a call changes nothing. A Report run of another Workspace, or a result of a retained run, answers 403.",
        "operationId": "ParablesAcknowledgeReportRunOutputsDeletedHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AcknowledgeReportRunOutputsDeletedInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AcknowledgeReportRunOutputsDeletedResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Acknowledge deleted Report run outputs",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "parables.report-runs.acknowledge-outputs-deleted",
          "description": "Records that the output tables of the named Plot results of one Report run were deleted. Each result must belong to the run and hold an output that no reader can reach: the run left retention, or it failed or was cancelled. Once no output of an expired run remains, the run records when its outputs were deleted. Repeating a call changes nothing. A Report run of another Workspace, or a result of a retained run, answers 403.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Acknowledge deleted Report run outputs",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/report-runs/{reportRunId}/query-run-transitions": {
      "post": {
        "description": "Applies one status change of the query run behind one Report Plot to that Plot's result, then updates the Report run: running from the first claim, complete only when every Plot is complete, failed or cancelled from the first Plot that fails or is cancelled. A complete, failed or cancelled Report run keeps its status; later changes update only their Plot's result. A change that is not newer than the one applied, or one for an unknown Report run, answers applied false. A Workspace, commit, Plot or query run that does not match the Report run answers 403.",
        "operationId": "ParablesApplyReportQueryRunTransitionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "reportRunId parameter",
            "in": "path",
            "name": "reportRunId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyReportQueryRunTransitionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ApplyReportQueryRunTransitionResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Apply a Report query run transition",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "parables.report-runs.apply-query-run-transition",
          "description": "Applies one status change of the query run behind one Report Plot to that Plot's result, then updates the Report run: running from the first claim, complete only when every Plot is complete, failed or cancelled from the first Plot that fails or is cancelled. A complete, failed or cancelled Report run keeps its status; later changes update only their Plot's result. A change that is not newer than the one applied, or one for an unknown Report run, answers applied false. A Workspace, commit, Plot or query run that does not match the Report run answers 403.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Apply a Report query run transition",
          "visibility": "internal"
        }
      }
    },
    "/api/parable/reports/scheduled-runs": {
      "post": {
        "description": "Creates the Report run for one due occurrence of a Report plan on the Workspace's own line, with its captured execution context and one pending result per Report Plot, and records the outcome on that Workspace's schedule of the plan. Every Workspace that publishes a plan runs it with its own schedule state. The run's id derives from the Workspace's line, the plan and the occurrence, so repeating a call answers ALREADY_CAPTURED with the same run. A plan saved, disabled, paused or deleted since the caller read it, or one the Workspace does not run, answers STALE and captures nothing. A Workspace that cannot run the Report answers REFUSED, and the failure is recorded on that Workspace's schedule. While another run of the Report is pending or running, the call answers SKIPPED_IN_FLIGHT and records nothing. A query_runner run comes back with the payload query-runner enqueues; this operation never enqueues. The fire names its trigger: SCHEDULED (the default) for an occurrence of the plan's recurrence, or SOURCES with the source changes that made the plan due, which the run records. A trigger the published plan no longer fires on answers STALE, and MANUAL answers 400.",
        "operationId": "ParablesCaptureScheduledReportRunHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaptureScheduledReportRunInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CaptureScheduledReportRunResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Capture a scheduled Report run",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "service",
          "capability": "parables.report-plans.capture-scheduled-run",
          "description": "Creates the Report run for one due occurrence of a Report plan on the Workspace's own line, with its captured execution context and one pending result per Report Plot, and records the outcome on that Workspace's schedule of the plan. Every Workspace that publishes a plan runs it with its own schedule state. The run's id derives from the Workspace's line, the plan and the occurrence, so repeating a call answers ALREADY_CAPTURED with the same run. A plan saved, disabled, paused or deleted since the caller read it, or one the Workspace does not run, answers STALE and captures nothing. A Workspace that cannot run the Report answers REFUSED, and the failure is recorded on that Workspace's schedule. While another run of the Report is pending or running, the call answers SKIPPED_IN_FLIGHT and records nothing. A query_runner run comes back with the payload query-runner enqueues; this operation never enqueues. The fire names its trigger: SCHEDULED (the default) for an occurrence of the plan's recurrence, or SOURCES with the source changes that made the plan due, which the run records. A trigger the published plan no longer fires on answers STALE, and MANUAL answers 400.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Capture a scheduled Report run",
          "visibility": "internal"
        }
      }
    },
    "/api/parables/authoring/primaries/{rootRefId}/live-sources": {
      "get": {
        "description": "Returns the Providers the Parable read in its newest Refresh, each with its connection status now and when its newest data was committed.",
        "operationId": "ParableAuthoringWorkspaceParableLiveSourcesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableReportLiveSourcesView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check how fresh a Parable's Providers are",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.live-sources.get",
          "description": "Returns the Providers the Parable read in its newest Refresh, each with its connection status now and when its newest data was committed.",
          "doNotUseWhen": "Do not use this operation for a past Refresh; its sources come with the report context.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId.",
              "description": "The Parable was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns each Provider with its current connection status and the commit time of its newest data.",
          "title": "Check how fresh a Parable's Providers are",
          "useWhen": "Show how each Provider a Workspace Parable reads stands now: its connection and how old its newest data is.",
          "visibility": "internal"
        }
      }
    },
    "/api/parables/authoring/primaries/{rootRefId}/report-plan-sources": {
      "get": {
        "description": "Returns the Provider connections and other Parables a Report plan of the Parable watches when it refreshes after its sources, read from its published Version, with each Parable's newest complete Refresh.",
        "operationId": "ParableAuthoringWorkspaceParableReportPlanSourcesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableReportPlanSourcesView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List what a Parable's Refreshes would follow",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.report-plan-sources.get",
          "description": "Returns the Provider connections and other Parables a Report plan of the Parable watches when it refreshes after its sources, read from its published Version, with each Parable's newest complete Refresh.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List what a Parable's Refreshes would follow",
          "visibility": "internal"
        }
      }
    },
    "/api/parables/authoring/primaries/{rootRefId}/report-runs/{reportRunId}/actions/cancel": {
      "post": {
        "description": "Stops a Report run that has not finished. Paid model calls stay cached, and nothing from the run becomes readable. Cancelling a cancelled run returns it unchanged.",
        "operationId": "ParableAuthoringCancelWorkspaceParableReportRunHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "reportRunId parameter",
            "in": "path",
            "name": "reportRunId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableReportRunView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Cancel a Report run",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.reports.cancel",
          "description": "Stops a Report run that has not finished. Paid model calls stay cached, and nothing from the run becomes readable. Cancelling a cancelled run returns it unchanged.",
          "doNotUseWhen": "Do not use this operation to remove a finished run or to stop a Preview.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId and reportRunId.",
              "description": "The Parable or the Report run was not found in this Workspace."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with Parable manage permission and the required RACI role.",
              "description": "The caller cannot cancel a Report run of this Parable."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Read the Report context; only a run that is still moving can be cancelled.",
              "description": "The Report run already finished, or it runs on the legacy Report worker, so it cannot be cancelled."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the Report run. Its query runs are cancelled; the run shows Cancelled once their cancellation is recorded.",
          "title": "Cancel a Report run",
          "useWhen": "Stop a Workspace Report run that is queued, running or paused at a Plot budget.",
          "visibility": "internal"
        }
      }
    },
    "/api/parables/authoring/primaries/{rootRefId}/report-runs/{reportRunId}/plots/{plotKey}/actions/raise-budget": {
      "post": {
        "description": "Raises the cost, call or runtime caps of one Plot that paused at its budget in a Report run, and resumes it. The caps apply to this run only; the published Plot does not change.",
        "operationId": "ParableAuthoringRaiseWorkspaceParableReportPlotBudgetHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "reportRunId parameter",
            "in": "path",
            "name": "reportRunId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "plotKey parameter",
            "in": "path",
            "name": "plotKey",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReportRunBudgetInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableReportRunView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Raise a Report Plot budget",
        "tags": [
          "parable-authoring"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.reports.raise-budget",
          "description": "Raises the cost, call or runtime caps of one Plot that paused at its budget in a Report run, and resumes it. The caps apply to this run only; the published Plot does not change.",
          "doNotUseWhen": "Do not use this operation to change the Plot budget for future runs; publish new caps instead.",
          "errors": [
            {
              "code": "PA-AU-001",
              "commonCorrection": "Check the rootRefId, reportRunId and plotKey.",
              "description": "The Parable, the Report run or the Plot was not found in this Workspace."
            },
            {
              "code": "PA-AU-019",
              "commonCorrection": "Use a Workspace identity with the budget override permission and the Primary seat.",
              "description": "The caller cannot raise a budget on this Parable."
            },
            {
              "code": "PA-AU-005",
              "commonCorrection": "Give at least one cap above both the current cap and the use so far, on a Plot that shows Budget paused.",
              "description": "No cap was given or a cap is not above the current cap and what the Plot has used (400), or the Plot is not paused at its budget (409)."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the Report run. The Plot resumes from what it had spent; it shows Running once query-runner records the resume.",
          "title": "Raise a Report Plot budget",
          "useWhen": "Resume a Plot of a Workspace Report run that paused at its budget, by raising its caps for this run.",
          "visibility": "internal"
        }
      }
    },
    "/api/parables/check-plot-for-prepare": {
      "post": {
        "description": "Judges one Plot on a draft ref as Prepare would if the Plot carried this SQL: the same checks, by the Plot's own execution path, with the same codes and messages. The SQL is planned, never run, and nothing is saved.",
        "operationId": "ParablesCheckPlotForPrepareHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlotPrepareCheckInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlotPrepareCheckResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check a Plot as Prepare would",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.reports.check-for-prepare",
          "description": "Judges one Plot on a draft ref as Prepare would if the Plot carried this SQL: the same checks, by the Plot's own execution path, with the same codes and messages. The SQL is planned, never run, and nothing is saved.",
          "doNotUseWhen": "Do not use this operation to read rows, to Prepare a Proposal, or to check a published Plot.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Send one SQL statement and JSON scalar parameters.",
              "description": "The SQL, query parameters, or selected definition is not conforming."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity and token with data-query access to this Workspace.",
              "description": "The caller, selected Workspace, or API token is not allowed to query this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Check the ref ID and the Plot key.",
              "description": "The draft ref is not in this Workspace, or the Plot is not on it."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the findings Prepare would record for the Plot with this SQL. An empty list means Prepare would record nothing.",
          "title": "Check a Plot as Prepare would",
          "useWhen": "Find out whether Prepare would block a Plot on a draft ref, and why, for SQL you are about to run or have just run.",
          "visibility": "internal"
        }
      }
    },
    "/api/parables/immediate-plot-query": {
      "post": {
        "description": "Runs a Plot's query once and returns the rows it produces, without saving a Report. Use it to see what a Plot would show before relying on it. With a Parable's refId or commitId, the SQL reads that Parable's Plots under their Panes' Policies; only someone who may edit the Parable reads other pools from there, and never under View as. No row cap applies beyond the Query Layer's own, which fails the query (QL-SQ-005); write a LIMIT in the SQL to bound the rows. Over HTTP the response body is an Arrow IPC stream (application/vnd.apache.arrow.stream) that is complete only when it ends with the IPC end-of-stream marker; a body that ends without it failed. A refusal is an RFC 9457 problem (application/problem+json). A tool caller receives ImmediatePlotQueryResult, holding at most 3 MiB of the stream's Arrow, with rowCount and truncated.",
        "operationId": "ParablesExecuteImmediatePlotQueryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImmediatePlotQueryInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/vnd.apache.arrow.stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "Successful response, streamed as application/vnd.apache.arrow.stream"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Preview a Plot",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.reports.preview",
          "description": "Runs a Plot's query once and returns the rows it produces, without saving a Report. Use it to see what a Plot would show before relying on it. With a Parable's refId or commitId, the SQL reads that Parable's Plots under their Panes' Policies; only someone who may edit the Parable reads other pools from there, and never under View as. No row cap applies beyond the Query Layer's own, which fails the query (QL-SQ-005); write a LIMIT in the SQL to bound the rows. Over HTTP the response body is an Arrow IPC stream (application/vnd.apache.arrow.stream) that is complete only when it ends with the IPC end-of-stream marker; a body that ends without it failed. A refusal is an RFC 9457 problem (application/problem+json). A tool caller receives ImmediatePlotQueryResult, holding at most 3 MiB of the stream's Arrow, with rowCount and truncated.",
          "doNotUseWhen": "Do not use this operation to schedule a Plot, save a Report, or update published Plot state.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Correct the query using the stated reason, and select a valid current or Report reading.",
              "description": "The SQL, query parameters, reading, or selected data does not satisfy the Plot contract. When the Query Layer refuses the SQL, the message is its reason and the code is its Query Layer code, such as QL-PL-002 for a relation or table function the catalog does not serve."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Read only the Parable's Plots, or run the SQL without refId or commitId with the Provider Pools Reader or Data Access role, or use an identity with permission to edit the Parable and a Publishing or Primary seat on it.",
              "description": "The caller, selected Workspace, or API token is not allowed to run this query. PA-AU-019 marks a refusal of the person's access: SQL that names no Parable needs the Provider Pools Reader or Data Access role; SQL in a Parable needs a seat on it and permission to read Parables, and reads beyond its Plots only with permission to edit it and a Publishing or Primary seat on it, never under View as; and a Plot's Pane Policies or a Provider Policy can refuse a table the SQL reads."
            },
            {
              "code": "QL-TN-007",
              "commonCorrection": "Do not run SQL over that Plot again as this caller. Other SQL over it gets the same refusal. Someone whom no Provider Policy or source permissions narrow on those tables can read it.",
              "description": "The SQL names a Plot whose rows a Report run stored (a stored Refresh), and Provider Policies or source permissions narrow what the caller reads of a Provider table behind it. The Refresh holds rows the caller cannot read, so it is refused (HTTP 403)."
            },
            {
              "code": "QL-SQ-010",
              "commonCorrection": "Filter, sample or LIMIT the rows before the AI function, or aggregate fewer rows. To call it over every row, publish the SQL as a Plot.",
              "description": "The query would send more paid AI calls (ponder, embed and the Jev functions) than one query may send, so it stopped before the next call (HTTP 400). The message names the limit and the function."
            },
            {
              "code": "QL-SQ-011",
              "commonCorrection": "Call the AI function over fewer rows or with a cheaper model. To call it over every row, publish the SQL as a Plot.",
              "description": "The query's paid AI calls would cost more than one query may spend, so it stopped before the next call (HTTP 400). The message names the limit and what the query spent."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Check the ref or commit ID and Workspace context.",
              "description": "The requested Parable ref or published pin is not available in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Plot context and retry, or use a published Version's commitId.",
              "description": "The Plot definition or access changed while the query was being prepared. With PA-AU-028, the commitId names a change that has not been published, so there is no Version to run SQL in."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the rows as Arrow IPC (at most 3 MiB of Arrow), how many rows it holds, whether the result was cut short, and the elapsed time.",
          "title": "Preview a Plot",
          "useWhen": "Run a Plot query once to inspect its rows without saving a Report. Write a LIMIT, an aggregation or a filter to bound the rows.",
          "visibility": "internal"
        }
      }
    },
    "/api/parables/immediate-plot-query/actions/estimate": {
      "post": {
        "description": "Plans the SQL exactly as preview_plot would run it and executes nothing. inputBytes counts the files the plan reads after partition pruning and before file-statistics pruning, so it is an upper bound on what the query reads; unmeasuredLeaves above 0 means the counts are a lower bound for some sources. computeCost prices the bytes at the platform rate; its CPU-time price and elapsedMs stay null until a model for that kind of query is measured. Each aiCallSites entry is one AI-call node with maxCalls, an upper bound on its paid calls: ad-hoc SQL reads no inference log, so each row that reaches the node is one call. The counts include rows that Policies hide from the caller.",
        "operationId": "ParablesEstimateImmediatePlotQueryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImmediatePlotQueryInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SqlEstimate"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Estimate a Plot query before running it",
        "tags": [
          "parables"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parable.authoring.reports.estimate",
          "description": "Plans the SQL exactly as preview_plot would run it and executes nothing. inputBytes counts the files the plan reads after partition pruning and before file-statistics pruning, so it is an upper bound on what the query reads; unmeasuredLeaves above 0 means the counts are a lower bound for some sources. computeCost prices the bytes at the platform rate; its CPU-time price and elapsedMs stay null until a model for that kind of query is measured. Each aiCallSites entry is one AI-call node with maxCalls, an upper bound on its paid calls: ad-hoc SQL reads no inference log, so each row that reaches the node is one call. The counts include rows that Policies hide from the caller.",
          "doNotUseWhen": "Do not use this operation to read rows, to see the query plan (run EXPLAIN with preview_plot), or to estimate a published Plot's next Refresh.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Correct the query using the stated reason.",
              "description": "The SQL, query parameters, or reading is not valid, or the Query Layer cannot plan the SQL. The message is the Query Layer reason and the code its Query Layer code."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity that may run the SQL, or estimate only what you may read.",
              "description": "The caller may not run this SQL, under the same rules as preview_plot (PA-AU-019)."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Check the ref or commit ID and Workspace context.",
              "description": "The requested Parable ref or published pin is not available in this Workspace."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the bytes, files and rows the query reads, its compute cost at the platform rates, and each AI-call node with the most calls it can make. Nothing runs and nothing is saved.",
          "title": "Estimate a Plot query before running it",
          "useWhen": "Find out how much data a query will read, what that costs, and how many paid AI calls it can make, before you run it with preview_plot.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets": {
      "get": {
        "description": "Returns every Pet you have adopted, including the ones on screen, the ones you have pocketed, and the ones you have let go. Pets belong to you personally, not to the Workspace.",
        "operationId": "ParableProblemListPersonPetsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PersonPetPageView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List your Pets",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.adoptions.list",
          "description": "Returns every Pet you have adopted, including the ones on screen, the ones you have pocketed, and the ones you have let go. Pets belong to you personally, not to the Workspace.",
          "doNotUseWhen": "Do not use when you need Pets that are available for a new adoption.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns your adopted Pets.",
          "title": "List your Pets",
          "useWhen": "Use when you need to see the Pets you have adopted and their current state.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/adoptions": {
      "post": {
        "description": "Adopts a Pet you have never had before from the catalog, gives it a random P name, and puts it on screen if you have room for another.",
        "operationId": "ParableProblemAdoptPetHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdoptPetInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AdoptPetResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Adopt a Pet",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.adoptions.create",
          "description": "Adopts a Pet you have never had before from the catalog, gives it a random P name, and puts it on screen if you have room for another.",
          "doNotUseWhen": "Do not use when you want a random Pet from an egg.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Choose an available Pet and provide a valid idempotency key.",
              "description": "The Pet choice or adoption input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder Pets in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh your Pets, then retry the identical request with its original key. Use a new key only for a deliberately new adoption after confirming the prior result.",
              "description": "The Pet state changed or the idempotency key was reused for another adoption."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the adopted Pet and its placement.",
          "title": "Adopt a Pet",
          "useWhen": "Use when you need to adopt a specific Pet from the catalog.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/catalog": {
      "get": {
        "description": "Returns the Pets available to adopt and the styles each one comes in. Pets still awaiting review stay hidden.",
        "operationId": "ParableProblemListPetCatalogHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "showPendingPets",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PetCatalogView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List the Pet catalog",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.catalog.list",
          "description": "Returns the Pets available to adopt and the styles each one comes in. Pets still awaiting review stay hidden.",
          "doNotUseWhen": "Do not use when you need the Pets one person has already adopted.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the available Pet catalog.",
          "title": "List the Pet catalog",
          "useWhen": "Use when you need the Pets and styles available before adopting or hatching a Pet.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/eggs": {
      "get": {
        "description": "Returns how many Pet eggs you have. Everyone starts with one, and you need one to hatch a Pet.",
        "operationId": "ParableProblemListPetEggsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PetEggsView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check your Pet eggs",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.eggs.list",
          "description": "Returns how many Pet eggs you have. Everyone starts with one, and you need one to hatch a Pet.",
          "doNotUseWhen": "Do not use when you need to see available Pets or your adopted Pets.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns your Pet egg balance.",
          "title": "Check your Pet eggs",
          "useWhen": "Use when you need to confirm that you have an egg before hatching a Pet.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/eggs/seen": {
      "post": {
        "description": "Records that you opened Pets, so the new-egg dot on the Pets control clears. Returns your Pet egg balance.",
        "operationId": "ParableProblemMarkPetEggsSeenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PetEggsView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Mark new Pet eggs seen",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.eggs.seen",
          "description": "Records that you opened Pets, so the new-egg dot on the Pets control clears. Returns your Pet egg balance.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Mark new Pet eggs seen",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/hatches": {
      "post": {
        "description": "Spends one egg to adopt a random Pet you have never had before. You need room on screen for it.",
        "operationId": "ParableProblemHatchPetHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HatchPetInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/HatchPetResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Hatch a Pet",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.eggs.hatch",
          "description": "Spends one egg to adopt a random Pet you have never had before. You need room on screen for it.",
          "doNotUseWhen": "Do not use when you want to choose the Pet yourself.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Provide a valid idempotency key and check your available eggs.",
              "description": "The hatch input is invalid or no usable egg is available."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder Pets in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh your Pets, then retry the identical request with its original key. Use a new key only for a deliberately new hatch after confirming the prior result.",
              "description": "The Pet state changed or the idempotency key was reused for another hatch."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns the hatched Pet and remaining egg balance.",
          "title": "Hatch a Pet",
          "useWhen": "Use when you need to spend an egg for a random new Pet.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/{personPetId}/actions/abandon": {
      "post": {
        "description": "Moves one of your Pets into Potential Pets. Its name, place and artwork are kept, and you can bring the same one back later.",
        "operationId": "ParableProblemAbandonPersonPetHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "personPetId parameter",
            "in": "path",
            "name": "personPetId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AbandonPersonPetInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Let a Pet go",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.adoptions.retire",
          "description": "Moves one of your Pets into Potential Pets. Its name, place and artwork are kept, and you can bring the same one back later.",
          "doNotUseWhen": "Do not use when you only need to hide the Pet temporarily.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Pet identifier and current mutation input.",
              "description": "The Pet identifier or mutation input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Workspace Pet."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Pet and retry with its current revision.",
              "description": "The Pet changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "success": "Returns whether the Pet was moved to Potential Pets.",
          "title": "Let a Pet go",
          "useWhen": "Use when you need to move a Pet to Potential Pets while preserving it for later.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/{personPetId}/actions/bring-out": {
      "post": {
        "description": "Brings one of your pocketed or let-go Pets back to where it was on screen.",
        "operationId": "ParableProblemBringPersonPetOutHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "personPetId parameter",
            "in": "path",
            "name": "personPetId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MutatePersonPetInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PersonPet"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Bring a Pet back",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.adoptions.bring-out",
          "description": "Brings one of your pocketed or let-go Pets back to where it was on screen.",
          "doNotUseWhen": "Do not use when you only need to update a Pet position.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Pet identifier and current mutation input.",
              "description": "The Pet identifier or mutation input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Workspace Pet."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Pet and retry with its current revision.",
              "description": "The Pet changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Pet with its updated placement.",
          "title": "Bring a Pet back",
          "useWhen": "Use when you need to put a pocketed or Potential Pet back on screen.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/{personPetId}/actions/put-in-pen": {
      "post": {
        "description": "Takes one of your Pets off screen without giving it up. Its name, its place and its artwork are all kept.",
        "operationId": "ParableProblemPutPersonPetInPenHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "personPetId parameter",
            "in": "path",
            "name": "personPetId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MutatePersonPetInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PersonPet"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Pocket a Pet",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.adoptions.pen",
          "description": "Takes one of your Pets off screen without giving it up. Its name, its place and its artwork are all kept.",
          "doNotUseWhen": "Do not use when you want to let the Pet go into Potential Pets.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Pet identifier and current mutation input.",
              "description": "The Pet identifier or mutation input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Workspace Pet."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Pet and retry with its current revision.",
              "description": "The Pet changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Pet with its updated placement.",
          "title": "Pocket a Pet",
          "useWhen": "Use when you need to take one on-screen Pet off screen without giving it up.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/{personPetId}/asset-revisions": {
      "post": {
        "description": "Adds a new piece of artwork to one of your Pets and makes it the one on screen. The artwork it was based on is kept.",
        "operationId": "ParableProblemRecordCustomizedPetRevisionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "personPetId parameter",
            "in": "path",
            "name": "personPetId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordCustomizedPetRevisionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PersonPet"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Save new artwork for a Pet",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.adoptions.artwork.create",
          "description": "Adds a new piece of artwork to one of your Pets and makes it the one on screen. The artwork it was based on is kept.",
          "doNotUseWhen": "Do not use when you need to adopt, hatch, or reposition a Pet.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Pet identifier and artwork revision input.",
              "description": "The Pet identifier or artwork input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Workspace Pet."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Pet and retry with its current revision.",
              "description": "The Pet or its artwork changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Pet with its new current artwork.",
          "title": "Save new artwork for a Pet",
          "useWhen": "Use when you need to save new artwork for one existing Pet.",
          "visibility": "internal"
        }
      }
    },
    "/api/pets/{personPetId}/position": {
      "patch": {
        "description": "Saves where one of your Pets sits on screen and which order it appears in.",
        "operationId": "ParableProblemRepositionPersonPetHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "personPetId parameter",
            "in": "path",
            "name": "personPetId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RepositionPersonPetInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PersonPet"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Move a Pet",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "pets.adoptions.reposition",
          "description": "Saves where one of your Pets sits on screen and which order it appears in.",
          "doNotUseWhen": "Do not use when you need to move the Pet into or out of the Pocket.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Use a valid Pet identifier and position input.",
              "description": "The Pet identifier or position input is invalid."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot change this Workspace Pet."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Refresh the Pet and retry with its current revision.",
              "description": "The Pet changed after the expected revision."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "compare_and_swap"
          },
          "success": "Returns the Pet with its updated position.",
          "title": "Move a Pet",
          "useWhen": "Use when you need to save a new position or display order for one Pet.",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/cleanup": {
      "post": {
        "description": "Fixes spelling, spacing, capitalization, closing punctuation and speech-to-text mistakes in a person's text before it is sent, using the Workspace's names and Parable terms. The server proposes corrections for each doubtful word and Jev picks among them, so the result holds only the person's own words or the listed corrections: it never adds, removes or reorders ideas. Changes nothing.",
        "operationId": "PonderLanguageCleanupPonderTextHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderCleanupInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderCleanupResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Clean up typed text",
        "tags": [
          "ponder-language"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.language.cleanup",
          "description": "Fixes spelling, spacing, capitalization, closing punctuation and speech-to-text mistakes in a person's text before it is sent, using the Workspace's names and Parable terms. The server proposes corrections for each doubtful word and Jev picks among them, so the result holds only the person's own words or the listed corrections: it never adds, removes or reorders ideas. Changes nothing.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Send the text as typed, then send it as is if cleanup is refused.",
              "description": "The text is empty or longer than 8,000 characters."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Omit rootRefId outside a Parable you can see.",
              "description": "The Parable named by rootRefId does not exist or you cannot see it."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Send the text as typed.",
              "description": "This Workspace's AI policy allows no processor for cleanup (WA-MP-008). Nothing was sent."
            },
            {
              "code": "HTTP 429",
              "commonCorrection": "Send the text as typed.",
              "description": "The Workspace has made this minute's share of cleanup requests. Nothing was sent."
            },
            {
              "code": "HTTP 503",
              "commonCorrection": "Send the text as typed.",
              "description": "The model is unavailable or not configured in this environment."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Clean up typed text",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/language": {
      "post": {
        "description": "Sends Ponder one prompt and returns its answer as text, or as JSON that matches a schema you give, without starting a conversation.",
        "operationId": "ParableProblemRunPonderLanguageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderLanguageInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderLanguageResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Ask Ponder for one answer",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.language.run",
          "description": "Sends Ponder one prompt and returns its answer as text, or as JSON that matches a schema you give, without starting a conversation.",
          "doNotUseWhen": "Do not use when the answer needs tools, approvals or a conversation the person can continue; ask Ponder in a Problem instead.",
          "errors": [
            {
              "code": "WA-PL-001",
              "commonCorrection": "Set OPENROUTER_API_KEY for web-api.",
              "description": "No OpenRouter key is configured for web-api in this environment."
            },
            {
              "code": "WA-PL-002",
              "commonCorrection": "Allow OpenRouter for Ponder's explanations and summaries in the Workspace's AI processors.",
              "description": "The Workspace's model policy allows no processor for Ponder's language calls."
            },
            {
              "code": "WA-PL-003",
              "commonCorrection": "Try again.",
              "description": "The model call failed or timed out."
            },
            {
              "code": "WA-PL-004",
              "commonCorrection": "Try again, or choose a model that keeps to schemas.",
              "description": "A response schema was given and the model did not answer with JSON."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "success": "Returns the answer, the model that wrote it, and the tokens it used.",
          "title": "Ask Ponder for one answer",
          "useWhen": "Use when you need one answer from a model, such as a summary or an explanation, outside a Ponder conversation.",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/parable": {
      "post": {
        "description": "Sends one new user Message on a Problem and streams Ponder's reply back as AI SDK UI message events, or continues a paused reply with the person's signed tool-approval decisions. The body is the AI SDK chat transport envelope carrying a PonderParableChatRequest; the Message UUID is the request identity, so retrying the same Message never starts a second reply. The response is a `text/event-stream`, so the route is registered by hand and the generated JSON clients cannot call it; the browser reaches it through its own server.",
        "operationId": "ParableProblemStreamPonderParableHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderParableChatRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Send a Message to Ponder",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.conversation.send",
          "description": "Sends one new user Message on a Problem and streams Ponder's reply back as AI SDK UI message events, or continues a paused reply with the person's signed tool-approval decisions. The body is the AI SDK chat transport envelope carrying a PonderParableChatRequest; the Message UUID is the request identity, so retrying the same Message never starts a second reply. The response is a `text/event-stream`, so the route is registered by hand and the generated JSON clients cannot call it; the browser reaches it through its own server.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "title": "Send a Message to Ponder",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/parable/{problemId}/messages/{assistantMessageId}/actions/steer": {
      "post": {
        "description": "Adds the person's words to their own reply while it is still running, as pi's steer does: they reach the model after the reply's current tool calls and before its next model call, and the reply keeps going with them. Only the person whose Message the reply answers can steer it. A reply that is waiting on an approval, has finished, or is not running on this server cannot be steered; send the words as a new Message instead.",
        "operationId": "ParableProblemSteerPonderParableMessageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "assistantMessageId parameter",
            "in": "path",
            "name": "assistantMessageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderSteerRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Steer a running Ponder reply",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.conversation.steer",
          "description": "Adds the person's words to their own reply while it is still running, as pi's steer does: they reach the model after the reply's current tool calls and before its next model call, and the reply keeps going with them. Only the person whose Message the reply answers can steer it. A reply that is waiting on an approval, has finished, or is not running on this server cannot be steered; send the words as a new Message instead.",
          "doNotUseWhen": "Do not use for a new question after the reply finishes, or on someone else's reply; send a new Message.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask a Workspace administrator for access to Ponder and the Parable.",
              "description": "You do not have the Ponder permission, or cannot view the Problem's Parable."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Select the Workspace that owns the Problem, then retry.",
              "description": "The Problem does not exist in this Workspace, or you cannot see it."
            },
            {
              "code": "PA-CH-056",
              "commonCorrection": "Send your words as a new Message.",
              "description": "The reply answers someone else's Message. Only its author can steer it."
            },
            {
              "code": "PA-CH-055",
              "commonCorrection": "Send the words as a new Message.",
              "description": "The reply is not running, so the words were not delivered."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns true once the words are with the running reply.",
          "title": "Steer a running Ponder reply",
          "useWhen": "Use to redirect your own Ponder reply while it runs, without waiting for it to finish.",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/parable/{problemId}/messages/{assistantMessageId}/actions/stop": {
      "post": {
        "description": "Ends one assistant reply on purpose. Leaving the page no longer stops a reply, so this is the only way to end one: anyone who can see the thread may stop it, the cancellation is written to the Message, and everyone in the thread sees the turn end. Accepted whether or not the reply is still streaming on this server; a completion that arrives afterwards for a finished Message is refused by its own idempotency.",
        "operationId": "ParableProblemStopPonderParableMessageHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "problemId parameter",
            "in": "path",
            "name": "problemId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "assistantMessageId parameter",
            "in": "path",
            "name": "assistantMessageId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StopPonderParableMessageInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Stop a Ponder reply",
        "tags": [
          "parable-problem"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.conversation.stop",
          "description": "Ends one assistant reply on purpose. Leaving the page no longer stops a reply, so this is the only way to end one: anyone who can see the thread may stop it, the cancellation is written to the Message, and everyone in the thread sees the turn end. Accepted whether or not the reply is still streaming on this server; a completion that arrives afterwards for a finished Message is refused by its own idempotency.",
          "doNotUseWhen": "Do not use to undo a finished reply; stopping never reverts changes a reply already made.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask a Workspace administrator for Ponder access.",
              "description": "You lack Ponder or Parable view permission in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Select the Workspace that owns the Problem, or use a Problem you can access.",
              "description": "The Problem does not exist in this Workspace or you cannot see it."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [
              "/idempotencyKey"
            ],
            "mode": "idempotent"
          },
          "success": "Returns true whenever the request is accepted, including when the reply already finished or the id matches no reply; read the Message to confirm it is cancelled.",
          "title": "Stop a Ponder reply",
          "useWhen": "Use to end a Ponder reply that is still running, such as one started with send_ponder_message. Pass the reply's idempotencyKey as assistantMessageId (send_ponder_message and await_ponder_reply return it as assistantMessageId), not the Message's row id, and a new UUID as idempotencyKey.",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/pick": {
      "post": {
        "description": "Chooses the one option that best answers a question about some text or data, and returns how the probability spread across the options. Accepts up to 20,000 options: above 255 it narrows them in rounds, and with groups it picks a group before its members. Filter out options that cannot apply before asking. Changes nothing.",
        "operationId": "PonderLanguagePickPonderOptionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderPickInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderPickResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Pick one option",
        "tags": [
          "ponder-language"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.language.pick",
          "description": "Chooses the one option that best answers a question about some text or data, and returns how the probability spread across the options. Accepts up to 20,000 options: above 255 it narrows them in rounds, and with groups it picks a group before its members. Filter out options that cannot apply before asking. Changes nothing.",
          "doNotUseWhen": "Do not use to generate text, to answer something code can compute exactly, or when several options may all apply; ask one yes-or-no question per option instead.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Send 2 to 20,000 options, with every option in a group when groups are used.",
              "description": "An option or group is malformed, there are fewer than 2 or more than 20,000 options, or an option belongs to no group."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Ask a Workspace administrator to allow the processor under Protection, AI Processors.",
              "description": "This Workspace's AI policy allows no processor for this feature (WA-MP-008). The details name the capability and the refusal. Nothing was sent."
            },
            {
              "code": "HTTP 429",
              "commonCorrection": "Wait for the seconds in the Retry-After header, then try again.",
              "description": "The Workspace has made this minute's share of these requests. Nothing was sent."
            },
            {
              "code": "HTTP 503",
              "commonCorrection": "Try again shortly; nothing was changed.",
              "description": "The model is unavailable or not configured in this environment."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the chosen option, its confidence, the final distribution and the model that answered.",
          "title": "Pick one option",
          "useWhen": "Use when you need to choose one item from a defined set by meaning: a category, a route, or the best matching record.",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/prioritize": {
      "post": {
        "description": "Places each item on the same ordered scale and returns them highest first, with each score and its spread. Each item is judged on its own, so scores are comparable. Change a threshold or a weight in your own code rather than asking again. Changes nothing.",
        "operationId": "PonderLanguagePrioritizePonderItemsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderPrioritizeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderPrioritizeResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Rank items on a scale",
        "tags": [
          "ponder-language"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.language.prioritize",
          "description": "Places each item on the same ordered scale and returns them highest first, with each score and its spread. Each item is judged on its own, so scores are comparable. Change a threshold or a weight in your own code rather than asking again. Changes nothing.",
          "doNotUseWhen": "Do not use to sort by a value the data already holds, or to choose a single winner; pick one option instead.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Send 1 to 100 items and 2 to 10 ordered levels, lowest first.",
              "description": "There are no items, more than 100, or fewer than 2 or more than 10 levels."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Ask a Workspace administrator to allow the processor under Protection, AI Processors.",
              "description": "This Workspace's AI policy allows no processor for this feature (WA-MP-008). The details name the capability and the refusal. Nothing was sent."
            },
            {
              "code": "HTTP 429",
              "commonCorrection": "Wait for the seconds in the Retry-After header, then try again.",
              "description": "The Workspace has made this minute's share of these requests. Nothing was sent."
            },
            {
              "code": "HTTP 503",
              "commonCorrection": "Try again shortly; nothing was changed.",
              "description": "The model is unavailable or not configured in this environment."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns every item ranked by score, with confidence and level probabilities, and the model that answered.",
          "title": "Rank items on a scale",
          "useWhen": "Use when you need to order up to 100 items by a quality described in words, such as urgency, fit or risk.",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/probe": {
      "post": {
        "description": "Returns the probability that the answer to a yes-or-no question about some text or data is yes. A result near 0.5 means the evidence is unclear, not that the answer is partly true. Changes nothing.",
        "operationId": "PonderLanguageProbePonderQuestionHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderProbeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderProbeResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Probe a yes-or-no question",
        "tags": [
          "ponder-language"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.language.probe",
          "description": "Returns the probability that the answer to a yes-or-no question about some text or data is yes. A result near 0.5 means the evidence is unclear, not that the answer is partly true. Changes nothing.",
          "doNotUseWhen": "Do not use for a condition code can check exactly, or to choose among several options; pick one option instead.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Send a yes-or-no question and the text or data it is about.",
              "description": "The question or the state is missing."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Ask a Workspace administrator to allow the processor under Protection, AI Processors.",
              "description": "This Workspace's AI policy allows no processor for this feature (WA-MP-008). The details name the capability and the refusal. Nothing was sent."
            },
            {
              "code": "HTTP 429",
              "commonCorrection": "Wait for the seconds in the Retry-After header, then try again.",
              "description": "The Workspace has made this minute's share of these requests. Nothing was sent."
            },
            {
              "code": "HTTP 503",
              "commonCorrection": "Try again shortly; nothing was changed.",
              "description": "The model is unavailable or not configured in this environment."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the probability of yes and the model that answered.",
          "title": "Probe a yes-or-no question",
          "useWhen": "Use when you need to know whether a condition holds, such as whether a request is urgent or a claim is supported by its source.",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/summarize": {
      "post": {
        "description": "Suggests a short title, a one-sentence description and a Font Awesome icon for something described in words, such as the first Message sent in a new Parable. Suggests only: it does not rename anything. While Summarize is on for a Parable, Ponder names it this way on its own. A person's edit to its name, description or icon turns Summarize off until someone turns it back on.",
        "operationId": "PonderLanguageSummarizePonderContextHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PonderSummarizeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderSummarizeResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Suggest a name, description and icon",
        "tags": [
          "ponder-language"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.language.summarize",
          "description": "Suggests a short title, a one-sentence description and a Font Awesome icon for something described in words, such as the first Message sent in a new Parable. Suggests only: it does not rename anything. While Summarize is on for a Parable, Ponder names it this way on its own. A person's edit to its name, description or icon turns Summarize off until someone turns it back on.",
          "doNotUseWhen": "Do not use to rename a Parable by itself; apply the suggestion with the identity operation if the person wants it.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Send the text that describes what is being named.",
              "description": "The context is empty or longer than 20,000 characters."
            },
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in and select the Workspace.",
              "description": "The request is not authenticated."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use a Workspace where you have Ponder access.",
              "description": "You cannot use Ponder in this Workspace."
            },
            {
              "code": "HTTP 409",
              "commonCorrection": "Ask a Workspace administrator to allow the processor under Protection, AI Processors.",
              "description": "This Workspace's AI policy allows no processor for this feature (WA-MP-008). The details name the capability and the refusal. Nothing was sent."
            },
            {
              "code": "HTTP 429",
              "commonCorrection": "Wait for the seconds in the Retry-After header, then try again.",
              "description": "The Workspace has made this minute's share of these requests. Nothing was sent."
            },
            {
              "code": "HTTP 503",
              "commonCorrection": "Try again shortly; nothing was changed.",
              "description": "The model is unavailable or not configured in this environment."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the suggested title, description and icon, and the model that wrote them.",
          "title": "Suggest a name, description and icon",
          "useWhen": "Use when you need a name, description and icon for a Parable from what it is about.",
          "visibility": "internal"
        }
      }
    },
    "/api/ponder/summarize-setting/{rootRefId}": {
      "get": {
        "description": "Returns whether Ponder keeps this Parable's name, description and icon up to date from its Messages, and whether you can change that. Changes nothing.",
        "operationId": "PonderLanguageGetPonderSummarizeSettingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderSummarizeSetting"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read Summarize for a Parable",
        "tags": [
          "ponder-language"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.language.summarize-setting.read",
          "description": "Returns whether Ponder keeps this Parable's name, description and icon up to date from its Messages, and whether you can change that. Changes nothing.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Parable you can see.",
              "description": "The Parable does not exist or you cannot see it."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read Summarize for a Parable",
          "visibility": "internal"
        }
      },
      "put": {
        "description": "Turns on or off whether Ponder keeps this Parable's name, description and icon up to date from its Messages. Turning it on lets Ponder change them again after a person's edit.",
        "operationId": "PonderLanguageSetPonderSummarizeSettingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "rootRefId parameter",
            "in": "path",
            "name": "rootRefId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPonderSummarizeSettingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PonderSummarizeSetting"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Turn Summarize on or off for a Parable",
        "tags": [
          "ponder-language"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "ponder.language.summarize-setting.update",
          "description": "Turns on or off whether Ponder keeps this Parable's name, description and icon up to date from its Messages. Turning it on lets Ponder change them again after a person's edit.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask someone Responsible or Accountable for the Parable.",
              "description": "You cannot edit this Parable."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a Parable you can see.",
              "description": "The Parable does not exist or you cannot see it."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Turn Summarize on or off for a Parable",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies": {
      "get": {
        "description": "Returns every Provider table the selected Workspace’s catalog serves with its columns and its Provider Policy, if any, the Workspace roles a rule can bind with how many members hold each, and stored Policies whose table the catalog no longer serves. Problems name each condition that no longer compiles against its table. Row counts are withheld for tables a Provider Policy narrows for the reader.",
        "operationId": "ProviderPoliciesGetProviderPoliciesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceProviderPolicies"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the Workspace’s Provider Policies",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.provider-policies.list",
          "description": "Returns every Provider table the selected Workspace’s catalog serves with its columns and its Provider Policy, if any, the Workspace roles a rule can bind with how many members hold each, and stored Policies whose table the catalog no longer serves. Problems name each condition that no longer compiles against its table. Row counts are withheld for tables a Provider Policy narrows for the reader.",
          "errors": [
            {
              "code": "WA-PP-007",
              "commonCorrection": "Try again.",
              "description": "The Query Layer could not list the Workspace’s Provider tables."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read the Workspace’s Provider Policies",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/source-permissions": {
      "get": {
        "description": "Returns whether the selected Workspace enforces source permissions, whether link-only grants admit their audience, the revision a change must name, and who last changed them. A Workspace that never saved them reads both as off at revision 0.",
        "operationId": "ProviderPoliciesGetSourcePermissionsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceSourcePermissions"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the Workspace’s source permissions settings",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.get",
          "description": "Returns whether the selected Workspace enforces source permissions, whether link-only grants admit their audience, the revision a change must name, and who last changed them. A Workspace that never saved them reads both as off at revision 0.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read the Workspace’s source permissions settings",
          "visibility": "internal"
        }
      },
      "put": {
        "description": "Replaces the selected Workspace’s source permissions settings: whether source permissions are enforced, and whether link-only grants admit their audience. With enforcement on, a table a connector models, with no Provider Policy, reads only the rows each reader may open in the source. A table with no model still reads all rows. The save is refused unless expectedRevision is the current revision. A change is kept in the settings’ history and recorded in the audit trail with the person and the old and new values. A save that changes nothing records nothing.",
        "operationId": "ProviderPoliciesSetSourcePermissionsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetSourcePermissionsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceSourcePermissions"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set the Workspace’s source permissions settings",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.set",
          "description": "Replaces the selected Workspace’s source permissions settings: whether source permissions are enforced, and whether link-only grants admit their audience. With enforcement on, a table a connector models, with no Provider Policy, reads only the rows each reader may open in the source. A table with no model still reads all rows. The save is refused unless expectedRevision is the current revision. A change is kept in the settings’ history and recorded in the audit trail with the person and the old and new values. A save that changes nothing records nothing.",
          "errors": [
            {
              "code": "WA-PP-009",
              "commonCorrection": "Load the settings again and make the change on top of them.",
              "description": "Someone changed the Workspace’s source permissions settings after the revision the save names."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "title": "Set the Workspace’s source permissions settings",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/source-permissions/account-links": {
      "get": {
        "description": "Returns the live links a Workspace administrator confirmed between a source user account and a member of the selected Workspace, newest first: the Provider, the account, the member, whether the member is active, and who confirmed the link and when. On each access run, the member’s login email gets the account’s tokens, as through an exact identity link, while the member is active and the account is an active user in the Provider.",
        "operationId": "ProviderPoliciesListSourceAccountLinksHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SourceAccountLinks"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List the source accounts linked to members",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.account-links.list",
          "description": "Returns the live links a Workspace administrator confirmed between a source user account and a member of the selected Workspace, newest first: the Provider, the account, the member, whether the member is active, and who confirmed the link and when. On each access run, the member’s login email gets the account’s tokens, as through an exact identity link, while the member is active and the account is an active user in the Provider.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List the source accounts linked to members",
          "visibility": "internal"
        }
      },
      "post": {
        "description": "Records that a source user account of a Provider belongs to the active member of the selected Workspace who signs in with the given email, when no exact identity link joins them. From the next access run, the member reads what that account may open in the Provider, as through an exact identity link, while the member is active and the account is an active user in the Provider. An account has at most one live link. Confirming the link that already exists returns it and changes nothing. Each new link is recorded in the audit trail with the person, the account and the member.",
        "operationId": "ProviderPoliciesConfirmSourceAccountLinkHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmSourceAccountLinkInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SourceAccountLink"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Link a source account to a member",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.account-links.confirm",
          "description": "Records that a source user account of a Provider belongs to the active member of the selected Workspace who signs in with the given email, when no exact identity link joins them. From the next access run, the member reads what that account may open in the Provider, as through an exact identity link, while the member is active and the account is an active user in the Provider. An account has at most one live link. Confirming the link that already exists returns it and changes nothing. Each new link is recorded in the audit trail with the person, the account and the member.",
          "errors": [
            {
              "code": "WA-PP-011",
              "commonCorrection": "Enter the email that a member of this Workspace signs in with.",
              "description": "No active member of the Workspace signs in with this email."
            },
            {
              "code": "WA-PP-013",
              "commonCorrection": "Remove the account’s link first, then link it to this member.",
              "description": "The account is already linked to another member."
            },
            {
              "code": "WA-PP-015",
              "commonCorrection": "Choose an account from the Unlinked accounts view.",
              "description": "The account is not a user account of a Provider in the catalog."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Link a source account to a member",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/source-permissions/account-links/{linkId}": {
      "delete": {
        "description": "Removes a link a Workspace administrator confirmed between a source account and a member of the selected Workspace. From the next access run, the member no longer gets the account’s tokens through it. Removing a link that is already removed changes nothing. Each removal is recorded in the audit trail with the person, the account and the member.",
        "operationId": "ProviderPoliciesRemoveSourceAccountLinkHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "linkId parameter",
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Remove a source account link",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.account-links.remove",
          "description": "Removes a link a Workspace administrator confirmed between a source account and a member of the selected Workspace. From the next access run, the member no longer gets the account’s tokens through it. Removing a link that is already removed changes nothing. Each removal is recorded in the audit trail with the person, the account and the member.",
          "errors": [
            {
              "code": "WA-PP-014",
              "commonCorrection": "Load the Workspace’s account links again.",
              "description": "The Workspace has no account link with this ID."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Remove a source account link",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/source-permissions/explain": {
      "post": {
        "description": "For the active member who signs in with the given email and one row of a modeled table, named by its value in the table’s anchor column, returns whether source permissions let that member read the row, each token that admits readers to it with the grants behind it, and, for each token the member holds, how they hold it: their own account, a group, team or role they belong to, a domain, or every user of the Provider. Only someone who reads every row of the table with their own SQL can ask. Each explanation is recorded in the audit trail with the member and the table, never the row.",
        "operationId": "ProviderPoliciesExplainSourcePermissionsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExplainSourcePermissionsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceSourcePermissionsExplanation"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Explain why one person reads one row under source permissions",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.explain",
          "description": "For the active member who signs in with the given email and one row of a modeled table, named by its value in the table’s anchor column, returns whether source permissions let that member read the row, each token that admits readers to it with the grants behind it, and, for each token the member holds, how they hold it: their own account, a group, team or role they belong to, a domain, or every user of the Provider. Only someone who reads every row of the table with their own SQL can ask. Each explanation is recorded in the audit trail with the member and the table, never the row.",
          "errors": [
            {
              "code": "WA-PP-007",
              "commonCorrection": "Try again.",
              "description": "The Query Layer could not read the access projection."
            },
            {
              "code": "WA-PP-011",
              "commonCorrection": "Enter the email that a member of this Workspace signs in with.",
              "description": "No active member of the Workspace signs in with this email."
            },
            {
              "code": "WA-PP-012",
              "commonCorrection": "Ask someone who reads every row of the table to explain it.",
              "description": "An explanation says who can open the table’s rows, and your own Policies narrow the table or your roles do not read it with SQL."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Explain why one person reads one row under source permissions",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/source-permissions/freshness": {
      "get": {
        "description": "Returns, for each Provider whose tables source permissions model, when the access projection was built, the oldest input sync it used, its age, and whether it is current, aging (older than 30 hours) or stale (older than 36 hours), or not built. A read of a modeled table under source permissions uses an aging or stale projection, and is refused while the projection is not built. Each Provider lists its modeled tables and, for each anchored table, the column that holds the row’s anchor key.",
        "operationId": "ProviderPoliciesGetSourcePermissionsFreshnessHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SourcePermissionsFreshnessResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read how current the source permissions projection is",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.freshness",
          "description": "Returns, for each Provider whose tables source permissions model, when the access projection was built, the oldest input sync it used, its age, and whether it is current, aging (older than 30 hours) or stale (older than 36 hours), or not built. A read of a modeled table under source permissions uses an aging or stale projection, and is refused while the projection is not built. Each Provider lists its modeled tables and, for each anchored table, the column that holds the row’s anchor key.",
          "errors": [
            {
              "code": "WA-PP-007",
              "commonCorrection": "Try again.",
              "description": "The Query Layer could not read the access projection."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read how current the source permissions projection is",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/source-permissions/preview": {
      "post": {
        "description": "For the active member who signs in with the given email, counts the rows of each table source permissions model and the rows that member can open in the Provider, as a read under source permissions would decide them with the Workspace’s link-only setting. It returns numbers, never rows. A table whose read under source permissions would be refused says so. Counts are withheld on a table the person asking does not read in full with their own SQL. Provider Policies are not applied. Each preview is recorded in the audit trail with the member it is about.",
        "operationId": "ProviderPoliciesPreviewSourcePermissionsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PreviewSourcePermissionsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceSourcePermissionsPreview"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Preview what one person reads under source permissions",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.preview",
          "description": "For the active member who signs in with the given email, counts the rows of each table source permissions model and the rows that member can open in the Provider, as a read under source permissions would decide them with the Workspace’s link-only setting. It returns numbers, never rows. A table whose read under source permissions would be refused says so. Counts are withheld on a table the person asking does not read in full with their own SQL. Provider Policies are not applied. Each preview is recorded in the audit trail with the member it is about.",
          "errors": [
            {
              "code": "WA-PP-007",
              "commonCorrection": "Try again.",
              "description": "The Query Layer could not read the access projection or count the tables."
            },
            {
              "code": "WA-PP-011",
              "commonCorrection": "Enter the email that a member of this Workspace signs in with.",
              "description": "No active member of the Workspace signs in with this email."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Preview what one person reads under source permissions",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/source-permissions/unlinked-accounts": {
      "get": {
        "description": "Returns the source user accounts that hold grants, directly or through a group, team or role, and that no active member of the selected Workspace reads through, because no exact identity link joins the account to the email a member signs in with. An account a Workspace administrator linked to an active member is not listed. The accounts with the most grants come first, at most 200, with the number of such accounts in all.",
        "operationId": "ProviderPoliciesListUnlinkedSourceAccountsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SourcePermissionsUnlinkedResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List source accounts no member reads through",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.source-permissions.unlinked-accounts",
          "description": "Returns the source user accounts that hold grants, directly or through a group, team or role, and that no active member of the selected Workspace reads through, because no exact identity link joins the account to the email a member signs in with. An account a Workspace administrator linked to an active member is not listed. The accounts with the most grants come first, at most 200, with the number of such accounts in all.",
          "errors": [
            {
              "code": "WA-PP-007",
              "commonCorrection": "Try again.",
              "description": "The Query Layer could not read the access projection."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "List source accounts no member reads through",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/{providerKey}/{tableKey}": {
      "put": {
        "description": "Replaces the Provider Policy on one Provider table of the selected Workspace: rules that bind Workspace roles to All rows, Rows where (SQL conditions over the table’s columns), Hidden or Source permissions (the rows each reader can open in the Provider, with optional conditions), and what Everyone else reads. Someone whose roles several rules name reads the union of those rules. It applies to every read in the Workspace, by a Parable’s Primary too. The save is refused unless every condition compiles against the table’s columns, unless a Source permissions rule is on a table whose Provider says who can open each row, and unless expectedRevision is the table’s current revision. Every save is kept in the Policy’s history.",
        "operationId": "ProviderPoliciesSetProviderPolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "providerKey parameter",
            "in": "path",
            "name": "providerKey",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "tableKey parameter",
            "in": "path",
            "name": "tableKey",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetProviderPolicyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ProviderPolicyRecord"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set one Provider table’s Provider Policy",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.provider-policies.set",
          "description": "Replaces the Provider Policy on one Provider table of the selected Workspace: rules that bind Workspace roles to All rows, Rows where (SQL conditions over the table’s columns), Hidden or Source permissions (the rows each reader can open in the Provider, with optional conditions), and what Everyone else reads. Someone whose roles several rules name reads the union of those rules. It applies to every read in the Workspace, by a Parable’s Primary too. The save is refused unless every condition compiles against the table’s columns, unless a Source permissions rule is on a table whose Provider says who can open each row, and unless expectedRevision is the table’s current revision. Every save is kept in the Policy’s history.",
          "errors": [
            {
              "code": "WA-PP-001",
              "commonCorrection": "Load the table’s Provider Policy again and make the change on top of it.",
              "description": "Someone saved this table’s Provider Policy after the revision the save names."
            },
            {
              "code": "WA-PP-002",
              "commonCorrection": "Choose a table the catalog serves. A Policy on a table that is gone can only be cleared.",
              "description": "The Workspace’s catalog serves no Provider table with this key."
            },
            {
              "code": "WA-PP-003",
              "commonCorrection": "Fix or remove each condition the problems name.",
              "description": "A condition does not compile against the table’s columns."
            },
            {
              "code": "WA-PP-004",
              "commonCorrection": "Bind only Workspace roles.",
              "description": "A rule names a role a Workspace administrator cannot assign in this Workspace."
            },
            {
              "code": "WA-PP-005",
              "commonCorrection": "Name each role in at most one rule of the table.",
              "description": "Two rules name the same role."
            },
            {
              "code": "WA-PP-006",
              "commonCorrection": "Keep a table to 50 rules, 100 conditions and 60 KiB of condition text.",
              "description": "The Policy is over a size limit or has a malformed rule."
            },
            {
              "code": "WA-PP-007",
              "commonCorrection": "Try again.",
              "description": "The Query Layer could not check the conditions, so nothing was saved."
            },
            {
              "code": "WA-PP-010",
              "commonCorrection": "Choose All rows, Rows where or Hidden for this table.",
              "description": "A rule reads Source permissions on a table whose Provider does not say who can open each row."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [
              "/expectedRevision"
            ],
            "idempotencyKeyPointers": [],
            "mode": "compare_and_swap"
          },
          "title": "Set one Provider table’s Provider Policy",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-policies/{providerKey}/{tableKey}/preview": {
      "post": {
        "description": "Compiles each condition of a proposed Provider Policy against the table’s columns, as saving it would, and returns every problem, the columns the conditions name, whether they read who is reading, and whether the table takes Source permissions. With count, it also counts the rows each rule and Everyone else would read, in one pass over the table, and returns numbers, never rows. A rule that reads Source permissions, or whose conditions read who is reading, is not counted. It stores nothing.",
        "operationId": "ProviderPoliciesPreviewProviderPolicyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "providerKey parameter",
            "in": "path",
            "name": "providerKey",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "description": "tableKey parameter",
            "in": "path",
            "name": "tableKey",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PreviewProviderPolicyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ProviderPolicyCheckResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Check a Provider Policy before saving it",
        "tags": [
          "provider-policies"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.provider-policies.preview",
          "description": "Compiles each condition of a proposed Provider Policy against the table’s columns, as saving it would, and returns every problem, the columns the conditions name, whether they read who is reading, and whether the table takes Source permissions. With count, it also counts the rows each rule and Everyone else would read, in one pass over the table, and returns numbers, never rows. A rule that reads Source permissions, or whose conditions read who is reading, is not counted. It stores nothing.",
          "errors": [
            {
              "code": "WA-PP-006",
              "commonCorrection": "Keep a table to 50 rules, 100 conditions and 60 KiB of condition text.",
              "description": "The Policy is over a size limit or has a malformed rule."
            },
            {
              "code": "WA-PP-007",
              "commonCorrection": "Try again.",
              "description": "The Query Layer could not check the conditions."
            },
            {
              "code": "WA-PP-008",
              "commonCorrection": "Check the Policy without counting, or ask someone who reads every row of the table to count it.",
              "description": "A count reads the table past every Provider Policy, and your own Policies narrow it or your roles do not read it with SQL."
            },
            {
              "code": "WA-PP-010",
              "commonCorrection": "Choose All rows, Rows where or Hidden for this table.",
              "description": "A rule reads Source permissions on a table whose Provider does not say who can open each row."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Check a Provider Policy before saving it",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-pool/describe-table": {
      "post": {
        "description": "Describes one table of the catalog. 1. tableRef is the name a FROM clause takes, such as providers.jiracloud.issues. 2. Each field has its Arrow type, its Parable scalar when it has one, and whether it is hidden or a system column. 3. importedForeignKeys are documented relationships, not enforced constraints: a join on one can still multiply rows. 4. A null row count, watermark or validation rate means unknown.",
        "operationId": "ProviderPoolDescribePoolTableHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DescribePoolTableInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PoolTableDescription"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Describe a Pool table",
        "tags": [
          "provider-pool"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.pool.describe-table",
          "description": "Describes one table of the catalog. 1. tableRef is the name a FROM clause takes, such as providers.jiracloud.issues. 2. Each field has its Arrow type, its Parable scalar when it has one, and whether it is hidden or a system column. 3. importedForeignKeys are documented relationships, not enforced constraints: a join on one can still multiply rows. 4. A null row count, watermark or validation rate means unknown.",
          "doNotUseWhen": "Do not use this operation to find a table; search available data first. It returns no rows.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Copy tableRef from a search result.",
              "description": "No table of that name is in a Pool the caller may read. The name may be misspelled, or the table may be in a Pool their role does not reach."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with data catalog permission.",
              "description": "The caller cannot read the Workspace data catalog."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the table's fields, primary key, relationships to other tables, row count and watermark where known, and the catalog version.",
          "title": "Describe a Pool table",
          "useWhen": "Read one table before querying it: its exact column names, their types and Parable scalars, its primary key and relationships, and how fresh it is.",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-pool/guidance": {
      "get": {
        "description": "Returns the built-in guidance for finding and querying Workspace data: Pool search, Providers and Plots. The texts are the same in every Workspace and need no Ponder permission. version changes when any text does.",
        "operationId": "ProviderPoolReadQueryGuidanceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/QueryGuidance"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read query guidance",
        "tags": [
          "provider-pool"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.pool.guidance",
          "description": "Returns the built-in guidance for finding and querying Workspace data: Pool search, Providers and Plots. The texts are the same in every Workspace and need no Ponder permission. version changes when any text does.",
          "doNotUseWhen": "Do not use this operation to read a Workspace's own edited Powers; list and read Powers for those.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with the Provider Pools Reader role.",
              "description": "The caller can neither read the data catalog nor query the Provider Pools."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the built-in Pool search, Providers and Plots texts and their version.",
          "title": "Read query guidance",
          "useWhen": "Read once, before the first search or query in a session: how the Pools are named, how to find a table, and the rules that keep a Provider query correct.",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-pool/plan": {
      "post": {
        "description": "Plans one SQL statement against the Provider Pools without running it. 1. The input is the one Query the Provider Pool takes. 2. A statement the Query Layer would refuse comes back as a refusal with its code and reason, such as QL-PL-002 for a name the catalog does not serve; correct the SQL from the reason. 3. No row is read, so a plan says nothing about whether the table holds rows.",
        "operationId": "ProviderPoolPlanSqlHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderPoolQueryInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanSqlResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Plan a SQL query",
        "tags": [
          "provider-pool"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.pool.plan",
          "description": "Plans one SQL statement against the Provider Pools without running it. 1. The input is the one Query the Provider Pool takes. 2. A statement the Query Layer would refuse comes back as a refusal with its code and reason, such as QL-PL-002 for a name the catalog does not serve; correct the SQL from the reason. 3. No row is read, so a plan says nothing about whether the table holds rows.",
          "doNotUseWhen": "Do not use this operation to read rows or to see the query plan (run EXPLAIN with query_provider_pool). It runs nothing, and LIMIT 0 runs the statement.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Send each parameter as a string, finite number, boolean or null.",
              "description": "A parameter is not a JSON scalar."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask a Workspace Administrator for the Provider Pools Reader role. A different query does not help.",
              "description": "The caller may not query data in this Workspace."
            },
            {
              "code": "HTTP 429",
              "commonCorrection": "Wait a moment, or for the seconds in the Retry-After header when it is set, then send the same request again.",
              "description": "Too many queries were running in the Query Layer, so the statement did not start (QL-IN-008), or the caller sent more than 120 of these requests in a minute. Nothing ran."
            },
            {
              "code": "HTTP 503",
              "commonCorrection": "Try again shortly. For QL-IN-009, read fewer columns or rows, or aggregate.",
              "description": "The Query Layer stopped the statement for lack of memory (QL-IN-009), or a service it needs did not answer, such as the model service behind semantic ranking or a SQL AI function (QL-IN-010). The code says which."
            },
            {
              "code": "HTTP 504",
              "commonCorrection": "Narrow the scope or the statement, then send it again.",
              "description": "The statement ran past its time budget (a QL-TO code) or did not finish in 30 seconds."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns planned true with the columns the statement would return, or planned false with the Query Layer refusal and its code.",
          "title": "Plan a SQL query",
          "useWhen": "Check a SQL statement before running it: whether it plans, and which columns and types it would return.",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-pool/query": {
      "post": {
        "description": "Runs one SQL statement over the Provider Pools (providers, providers_quarantine, providers_quality) and returns a view a model can read. 1. sql is one read-only statement. 2. parameters bind $1, $2 in order; identifiers cannot be bound. 3. The view holds whole leading rows within 60,000 characters, columns included, and cuts a text or binary value at 2,000; truncated says which limit applied and warnings say what to change. 4. returnedRows counts the rows shown, never the total. 5. A 64-bit integer past 2^53 and every decimal arrive as text beside their arrowType. 6. A table in another Pool is an unknown relation (QL-PL-002).",
        "operationId": "ProviderPoolQueryProviderPoolHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderPoolQueryInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/QueryResultView"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Query the Provider Pool",
        "tags": [
          "provider-pool"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.pool.query",
          "description": "Runs one SQL statement over the Provider Pools (providers, providers_quarantine, providers_quality) and returns a view a model can read. 1. sql is one read-only statement. 2. parameters bind $1, $2 in order; identifiers cannot be bound. 3. The view holds whole leading rows within 60,000 characters, columns included, and cuts a text or binary value at 2,000; truncated says which limit applied and warnings say what to change. 4. returnedRows counts the rows shown, never the total. 5. A 64-bit integer past 2^53 and every decimal arrive as text beside their arrowType. 6. A table in another Pool is an unknown relation (QL-PL-002).",
          "doNotUseWhen": "Do not use this operation to preview a Plot inside a Parable, to read the Workspace, Artifact or Parable Pools, or to write data.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Correct the SQL from the stated reason; describe the table again if a name is unknown. Do not resend the same statement.",
              "description": "The Query Layer refused the SQL. The message is its reason and the code is its Query Layer code, such as QL-PL-002 for a table or function the Provider Pools do not serve."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask a Workspace Administrator for the Provider Pools Reader role. A different query does not help.",
              "description": "The caller may not query data in this Workspace."
            },
            {
              "code": "HTTP 504",
              "commonCorrection": "Filter on a partition column, aggregate, or add a LIMIT.",
              "description": "The statement ran past its time budget (a QL-TO code) or did not finish in 30 seconds."
            },
            {
              "code": "HTTP 429",
              "commonCorrection": "Wait a moment, or for the seconds in the Retry-After header when it is set, then send the same request again.",
              "description": "Too many queries were running in the Query Layer, so the statement did not start (QL-IN-008), or the caller sent more than 120 of these requests in a minute. Nothing ran."
            },
            {
              "code": "HTTP 503",
              "commonCorrection": "Try again shortly. For QL-IN-009, read fewer columns or rows, or aggregate.",
              "description": "The Query Layer stopped the statement for lack of memory (QL-IN-009), or a service it needs did not answer, such as the model service behind semantic ranking or a SQL AI function (QL-IN-010). The code says which."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns typed columns and whole leading rows, how many rows the view holds, what was left out and why, and the elapsed time.",
          "title": "Query the Provider Pool",
          "useWhen": "Run one read-only SQL statement over Provider data and read its rows as typed JSON. Write a LIMIT, an aggregation or a filter to bound the rows, and bind values with $1, $2 and parameters.",
          "visibility": "internal"
        }
      }
    },
    "/api/provider-pool/search": {
      "post": {
        "description": "Searches the Provider Pools for the tables, columns and fields that hold the data a question needs. 1. query is plain text. 2. scope narrows by name before ranking: providers.jiracloud is one Provider, providers.jiracloud.issues.* the columns of one table. 3. kind keeps tables or columns. 4. limit and offset page through at most 500 ranked results. Results rank by keyword; matchedBy says whether meaning also matched. 5. An empty query (or *) lists instead of searching. With no scope, providers holds every Provider the caller may query and its table count. With one Provider as scope, such as providers.jiracloud, matches holds its tables by name with their descriptions and row counts, limit a page (100 by default, at most 40,000 characters), and nextCursor, sent back as cursor, reads the next page. A listing covers the providers Pool, as a search does. The search reads names and descriptions, never rows.",
        "operationId": "ProviderPoolSearchAvailableDataHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchAvailableDataInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SearchAvailableDataResult"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Search available data",
        "tags": [
          "provider-pool"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.pool.search",
          "description": "Searches the Provider Pools for the tables, columns and fields that hold the data a question needs. 1. query is plain text. 2. scope narrows by name before ranking: providers.jiracloud is one Provider, providers.jiracloud.issues.* the columns of one table. 3. kind keeps tables or columns. 4. limit and offset page through at most 500 ranked results. Results rank by keyword; matchedBy says whether meaning also matched. 5. An empty query (or *) lists instead of searching. With no scope, providers holds every Provider the caller may query and its table count. With one Provider as scope, such as providers.jiracloud, matches holds its tables by name with their descriptions and row counts, limit a page (100 by default, at most 40,000 characters), and nextCursor, sent back as cursor, reads the next page. A listing covers the providers Pool, as a search does. The search reads names and descriptions, never rows.",
          "doNotUseWhen": "Do not use this operation to read rows; it returns names, types and descriptions only. A listed table can be empty.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Start the scope with providers, such as providers.jiracloud or providers.*.issues, or leave scope and kind out. A workspace scope finds nothing through this operation. Page a listing with nextCursor, and a search with offset.",
              "description": "The scope is not a dotted name that starts with providers or workspace, or the scope and kind can never match together. A listing was sent a column kind, an offset, a scope other than one Provider by name, or another listing's cursor; a search was sent a cursor. The message says what to change. A scope in a Pool the caller may not query is not an error: the search finds nothing."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask a Workspace Administrator for the Provider Pools Reader role. A different query does not help.",
              "description": "The caller may not query data in this Workspace."
            },
            {
              "code": "HTTP 429",
              "commonCorrection": "Wait a moment, or for the seconds in the Retry-After header when it is set, then send the same request again.",
              "description": "Too many queries were running in the Query Layer, so the statement did not start (QL-IN-008), or the caller sent more than 120 of these requests in a minute. Nothing ran."
            },
            {
              "code": "HTTP 503",
              "commonCorrection": "Try again shortly. For QL-IN-009, read fewer columns or rows, or aggregate.",
              "description": "The Query Layer stopped the statement for lack of memory (QL-IN-009), or a service it needs did not answer, such as the model service behind semantic ranking or a SQL AI function (QL-IN-010). The code says which."
            },
            {
              "code": "HTTP 504",
              "commonCorrection": "Narrow the scope or the statement, then send it again.",
              "description": "The statement ran past its time budget (a QL-TO code) or did not finish in 30 seconds."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns up to limit matches, best first: the tableRef to put in FROM, the columnName to select, its type, its description and how it matched. A listing returns providers with their table counts, or one Provider's tables by name with nextCursor for the next page.",
          "title": "Search available data",
          "useWhen": "Find which tables and columns hold the data a question needs, before writing SQL. Describe the data in the words a name or description would use, search tables first, then narrow to one Provider or one table with scope. To see everything the caller may query, send an empty query: it lists each Provider, then one Provider's tables.",
          "visibility": "internal"
        }
      }
    },
    "/api/query/info": {
      "get": {
        "description": "Get tenant info for the current tenant context",
        "operationId": "RootInfoHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Tenant"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "info",
        "tags": [
          "root"
        ]
      }
    },
    "/api/refresh-cost-threshold": {
      "get": {
        "description": "Returns the selected Workspace’s Refresh cost threshold, in US cents: the change preview calls out a predicted cost of the next Refresh above it. A Workspace that never set one gets the platform default, and the result says which applies and who last set it. Requires permission to change the Workspace’s Refresh cost threshold.",
        "operationId": "RefreshCostThresholdGetRefreshCostThresholdHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceRefreshCostThreshold"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the Workspace’s Refresh cost threshold",
        "tags": [
          "refresh-cost-threshold"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parables.refresh-cost-threshold.get",
          "description": "Returns the selected Workspace’s Refresh cost threshold, in US cents: the change preview calls out a predicted cost of the next Refresh above it. A Workspace that never set one gets the platform default, and the result says which applies and who last set it. Requires permission to change the Workspace’s Refresh cost threshold.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read the Workspace’s Refresh cost threshold",
          "visibility": "internal"
        }
      },
      "put": {
        "description": "Replaces the selected Workspace’s Refresh cost threshold, in US cents: the change preview calls out a predicted cost of the next Refresh above it. The field is required, and null returns the Workspace to the platform default. A change is recorded in the audit trail with the person and the old and new thresholds; a write that changes nothing records nothing. Returns the threshold that now applies.",
        "operationId": "RefreshCostThresholdSetRefreshCostThresholdHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetRefreshCostThresholdInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WorkspaceRefreshCostThreshold"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Set the Workspace’s Refresh cost threshold",
        "tags": [
          "refresh-cost-threshold"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "parables.refresh-cost-threshold.set",
          "description": "Replaces the selected Workspace’s Refresh cost threshold, in US cents: the change preview calls out a predicted cost of the next Refresh above it. The field is required, and null returns the Workspace to the platform default. A change is recorded in the audit trail with the person and the old and new thresholds; a write that changes nothing records nothing. Returns the threshold that now applies.",
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "title": "Set the Workspace’s Refresh cost threshold",
          "visibility": "internal"
        }
      }
    },
    "/api/roles/roles": {
      "get": {
        "description": "Lists the roles that can be given to people in this Workspace.",
        "operationId": "RolesRolesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "description": "Signed 64-bit integer; range bounded by JavaScript's safe-integer ceiling.",
              "format": "int64",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RolesPaginatedResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List roles",
        "tags": [
          "roles"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.roles.roles",
          "description": "Lists the roles that can be given to people in this Workspace.",
          "doNotUseWhen": "Do not use when you need a person’s current roles; read that person instead.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can view people and roles.",
              "description": "You cannot view roles in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns a page of tenant-assignable roles.",
          "title": "List roles",
          "useWhen": "Use when you need roles that can be assigned to people in the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/security/content-encryption-key": {
      "get": {
        "description": "Gets the tenant's content-encryption public key. The Pulse desktop agent\nwraps each batch's data encryption key under it; the collector unwraps\nvia KMS at ingest. Sibling of the credential encryption key with an\nindependent decrypt blast radius.",
        "operationId": "SecurityContentEncryptionKeyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PublicEncryptionKey"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "contentEncryptionKey",
        "tags": [
          "security"
        ]
      }
    },
    "/api/security/encryption-key": {
      "get": {
        "description": "Gets the public key for encrypting sensitive data\nto submit to encrypted endpoints",
        "operationId": "SecurityEncryptionKeyHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PublicEncryptionKey"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "encryptionKey",
        "tags": [
          "security"
        ]
      }
    },
    "/api/tenant-connector-taps/create-tenant-connector-tap": {
      "post": {
        "description": "Sets up a Tap — one stream of data — on a Provider connection in this Workspace. Anything you leave out is copied from the Provider's own definition of that Tap.",
        "operationId": "TenantConnectorTapsCreateTenantConnectorTapHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTenantConnectorTapInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantConnectorTapInfo"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Add a Tap to a Provider connection",
        "tags": [
          "tenant-connector-taps"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.taps.create-tenant-connector-tap",
          "description": "Sets up a Tap — one stream of data — on a Provider connection in this Workspace. Anything you leave out is copied from the Provider's own definition of that Tap.",
          "doNotUseWhen": "Do not use this operation to publish an uploaded Artifact or modify an existing Tap.",
          "errors": [
            {
              "code": "WA-TCT-002",
              "commonCorrection": "Use a connection from the current Workspace.",
              "description": "The Provider connection belongs to a different Workspace."
            },
            {
              "code": "WA-TCT-003",
              "commonCorrection": "Choose a Tap offered by the selected Provider connection.",
              "description": "The requested Provider Tap was not found."
            },
            {
              "code": "WA-TCT-015",
              "commonCorrection": "Select a Tap from the same Provider connection.",
              "description": "The Tap does not belong to the selected Provider connection."
            },
            {
              "code": "WA-TCT-006",
              "commonCorrection": "Choose a unique name or update the existing Tap.",
              "description": "A Tap with this name already exists on the connection."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Creates and returns the configured Tap.",
          "title": "Add a Tap to a Provider connection",
          "useWhen": "Configure a new data stream on an existing Workspace Provider connection.",
          "visibility": "internal"
        }
      }
    },
    "/api/tenant-connector-taps/provider-pool-rebuilds": {
      "get": {
        "description": "Lists rebuilds of this Workspace's Provider data, optionally narrowed to one state. A rebuild rewrites a Tap's stored tables after a change to how they are laid out; it waits for approval first. Stale marks a pending item older than the configured age.",
        "operationId": "TenantConnectorTapsTenantProviderPoolRebuildsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ProviderPoolRebuildStateEnum"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantProviderPoolRebuild"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Provider Pool rebuilds",
        "tags": [
          "tenant-connector-taps"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.pool-rebuilds.tenant-list",
          "description": "Lists rebuilds of this Workspace's Provider data, optionally narrowed to one state. A rebuild rewrites a Tap's stored tables after a change to how they are laid out; it waits for approval first. Stale marks a pending item older than the configured age.",
          "doNotUseWhen": "Do not use this operation to approve or decline a rebuild.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with rebuild view permission.",
              "description": "The caller cannot view this Workspace's rebuilds."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns this Workspace's rebuild items, newest request first.",
          "title": "List Provider Pool rebuilds",
          "useWhen": "See which of this Workspace's Taps wait for a rebuild approval, or are being rebuilt.",
          "visibility": "internal"
        }
      }
    },
    "/api/tenant-connector-taps/provider-pool-rebuilds/{id}/approve": {
      "post": {
        "description": "Approves a pending rebuild of a Tap's stored tables. The request carries the classification hash you were shown, so a rebuild that changed since you read it is refused. With notBefore, the rebuild waits until that time.",
        "operationId": "TenantConnectorTapsApproveTenantProviderPoolRebuildHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApproveTenantProviderPoolRebuildInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantProviderPoolRebuild"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Approve a Provider Pool rebuild",
        "tags": [
          "tenant-connector-taps"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.pool-rebuilds.tenant-approve",
          "description": "Approves a pending rebuild of a Tap's stored tables. The request carries the classification hash you were shown, so a rebuild that changed since you read it is refused. With notBefore, the rebuild waits until that time.",
          "doNotUseWhen": "Do not use this operation to approve a rebuild you were not shown.",
          "errors": [
            {
              "code": "WA-TCT-030",
              "commonCorrection": "Check the rebuild ID.",
              "description": "No rebuild with this ID belongs to this Workspace."
            },
            {
              "code": "WA-TCT-031",
              "commonCorrection": "Read the rebuild again and approve what it now changes.",
              "description": "The classification hash differs from the rebuild's. The details carry currentClassificationHash."
            },
            {
              "code": "WA-TCT-032",
              "commonCorrection": "Approve the replacing rebuild instead.",
              "description": "A later change replaced the rebuild. The details carry successorId, null when the change was reverted."
            },
            {
              "code": "WA-TCT-033",
              "commonCorrection": "Wait for that rebuild to finish.",
              "description": "Another rebuild of the same Tap is in progress. The details carry inProgressRebuildId."
            },
            {
              "code": "WA-TCT-034",
              "commonCorrection": "Read the rebuild's state.",
              "description": "The rebuild is not waiting for approval. The details carry state."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "success": "Returns the approved rebuild.",
          "title": "Approve a Provider Pool rebuild",
          "useWhen": "Approve a pending rebuild of one of this Workspace's Taps, now or from a later time.",
          "visibility": "internal"
        }
      }
    },
    "/api/tenant-connector-taps/provider-pool-rebuilds/{id}/decline": {
      "post": {
        "description": "Declines a pending rebuild with a reason. The Tap keeps its current stored layout, and the same change is not proposed again until the Tap's settings change.",
        "operationId": "TenantConnectorTapsDeclineTenantProviderPoolRebuildHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeclineTenantProviderPoolRebuildInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantProviderPoolRebuild"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Decline a Provider Pool rebuild",
        "tags": [
          "tenant-connector-taps"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.pool-rebuilds.tenant-decline",
          "description": "Declines a pending rebuild with a reason. The Tap keeps its current stored layout, and the same change is not proposed again until the Tap's settings change.",
          "doNotUseWhen": "Do not use this operation to postpone a rebuild; approve it with notBefore instead.",
          "errors": [
            {
              "code": "WA-TCT-030",
              "commonCorrection": "Check the rebuild ID.",
              "description": "No rebuild with this ID belongs to this Workspace."
            },
            {
              "code": "WA-TCT-032",
              "commonCorrection": "Decline the replacing rebuild instead.",
              "description": "A later change replaced the rebuild. The details carry successorId, null when the change was reverted."
            },
            {
              "code": "WA-TCT-034",
              "commonCorrection": "Read the rebuild's state.",
              "description": "The rebuild is not waiting for approval. The details carry state."
            }
          ],
          "lifecycle": "experimental",
          "mappingStatus": "mapped",
          "success": "Returns the declined rebuild.",
          "title": "Decline a Provider Pool rebuild",
          "useWhen": "Decline a pending rebuild of one of this Workspace's Taps.",
          "visibility": "internal"
        }
      }
    },
    "/api/tenant-connector-taps/tenant-connector-taps": {
      "get": {
        "description": "Lists the Taps set up in this Workspace, optionally narrowed to a single Provider connection.",
        "operationId": "TenantConnectorTapsTenantConnectorTapsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "tenantConnectorId",
            "required": false,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "maximum": 250,
              "type": "number"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "format": "double",
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantConnectorTapInfo"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List this Workspace's Taps",
        "tags": [
          "tenant-connector-taps"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.taps.tenant-connector-taps",
          "description": "Lists the Taps set up in this Workspace, optionally narrowed to a single Provider connection.",
          "doNotUseWhen": "Do not use this operation to discover every Tap a Provider could offer.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Tap view permission.",
              "description": "The caller cannot view Workspace Taps."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns a stable page of configured Workspace Taps.",
          "title": "List this Workspace's Taps",
          "useWhen": "List configured Workspace Taps, optionally for one Provider connection.",
          "visibility": "internal"
        }
      }
    },
    "/api/tenant-connector-taps/{id}": {
      "delete": {
        "description": "Deletes a Tap from a Provider connection. It is refused while anything is still reading from that Tap, so remove those first.",
        "operationId": "TenantConnectorTapsDeleteTenantConnectorTapHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Delete a Tap",
        "tags": [
          "tenant-connector-taps"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.taps.delete-tenant-connector-tap",
          "description": "Deletes a Tap from a Provider connection. It is refused while anything is still reading from that Tap, so remove those first.",
          "doNotUseWhen": "Do not use this operation to pause a Tap while keeping its catalog contract; disable it instead.",
          "errors": [
            {
              "code": "WA-TCT-001",
              "commonCorrection": "Check the Tap identifier.",
              "description": "The Tap was not found in this Workspace."
            },
            {
              "code": "WA-TCT-007",
              "commonCorrection": "Remove dependent contracts before deleting the Tap.",
              "description": "The Tap is still referenced by a ConnectorTapContract."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Deletes the Tap and returns true.",
          "title": "Delete a Tap",
          "useWhen": "Remove a Workspace Tap that should no longer be ingested.",
          "visibility": "internal"
        }
      },
      "get": {
        "description": "Returns one Tap on a Provider connection in this Workspace.",
        "operationId": "TenantConnectorTapsTenantConnectorTapHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantConnectorTapInfo"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read a Tap",
        "tags": [
          "tenant-connector-taps"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.taps.tenant-connector-tap",
          "description": "Returns one Tap on a Provider connection in this Workspace.",
          "doNotUseWhen": "Do not use this operation to list Taps or change its settings.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with Tap view permission.",
              "description": "The caller cannot view Workspace Taps."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Tap when it belongs to this Workspace, otherwise null.",
          "title": "Read a Tap",
          "useWhen": "Inspect one configured Workspace Tap.",
          "visibility": "internal"
        }
      },
      "patch": {
        "description": "Updates the settings on an existing Tap. Which Provider connection it belongs to, which Provider Tap it came from, and a published Artifact's table name and storage cannot be changed.",
        "operationId": "TenantConnectorTapsUpdateTenantConnectorTapHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTenantConnectorTapInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantConnectorTapInfo"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Change a Tap's settings",
        "tags": [
          "tenant-connector-taps"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.taps.update-tenant-connector-tap",
          "description": "Updates the settings on an existing Tap. Which Provider connection it belongs to, which Provider Tap it came from, and a published Artifact's table name and storage cannot be changed.",
          "doNotUseWhen": "Do not use this operation to move a Tap to another Provider connection or change its source Tap.",
          "errors": [
            {
              "code": "WA-TCT-001",
              "commonCorrection": "Check the Tap identifier.",
              "description": "The Tap was not found in this Workspace."
            },
            {
              "code": "WA-TCT-008",
              "commonCorrection": "Provide at least one allowed setting to change.",
              "description": "No editable Tap settings were supplied."
            },
            {
              "code": "WA-TCT-022",
              "commonCorrection": "Keep field names and types identical; change only allowed metadata.",
              "description": "The replacement output schema is not structurally compatible."
            },
            {
              "code": "WA-TCT-024",
              "commonCorrection": "Provide a non-empty selectedFields list only for supported Provider Taps.",
              "description": "The selected field configuration is invalid."
            },
            {
              "code": "WA-TCT-029",
              "commonCorrection": "Leave out materializedDefault, systemDisabled, catalogSlug and storageUri; the stored values are kept.",
              "description": "The config sets a key only the platform writes."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the Tap with its updated settings.",
          "title": "Change a Tap's settings",
          "useWhen": "Change the editable settings of an existing Workspace Tap.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/invitations": {
      "post": {
        "description": "Emails an invitation to join this Workspace with the roles you choose. Accepting it gives that person access, so it needs a person's approval.",
        "operationId": "UsersInviteUserHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteTenantUserInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/UserBase"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Invite someone to the Workspace",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.invite-user",
          "description": "Emails an invitation to join this Workspace with the roles you choose. Accepting it gives that person access, so it needs a person's approval.",
          "doNotUseWhen": "Do not use when the person is already an active member or when you only need to resend an existing invitation.",
          "errors": [
            {
              "code": "HTTP 422",
              "commonCorrection": "Provide a valid person and at least one assignable role.",
              "description": "The invitation input is invalid, such as missing roles or an ineligible person."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Choose roles within your authority or ask a Workspace administrator.",
              "description": "You cannot invite people or assign the requested roles in this Workspace."
            },
            {
              "code": "WA-TN-003",
              "commonCorrection": "Ask Parable staff to grant access instead of inviting or reactivating someone.",
              "description": "The Workspace is a dogfood or demo Workspace, where membership comes only from Parable staff-role grants."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Creates a pending invitation for the selected Workspace.",
          "title": "Invite someone to the Workspace",
          "useWhen": "Use when you need to invite a new person to the selected Workspace with specific roles.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/invitations/default-role": {
      "post": {
        "description": "Emails an invitation to join this Workspace with the Workspace's default role, the role set under Protection, Login. Accepting it gives that person access, so it needs a person's approval. Only a person can invite someone with other roles.",
        "operationId": "UsersInviteUserWithDefaultRoleHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteUserWithDefaultRoleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/UserBase"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Invite someone with the default role",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.invite-user-with-default-role",
          "description": "Emails an invitation to join this Workspace with the Workspace's default role, the role set under Protection, Login. Accepting it gives that person access, so it needs a person's approval. Only a person can invite someone with other roles.",
          "doNotUseWhen": "Do not use when the person is already an active member, when you only need to resend an existing invitation, or when they need roles other than the default; a person invites them from People.",
          "errors": [
            {
              "code": "WA-AU-036",
              "commonCorrection": "Ask a Workspace manager to choose the default role under Protection, Login.",
              "description": "The Workspace has no default role to give."
            },
            {
              "code": "HTTP 422",
              "commonCorrection": "Provide the email of someone who is not already a member.",
              "description": "The invitation input is invalid, such as an ineligible person."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask a Workspace administrator.",
              "description": "You cannot invite people or give the default role in this Workspace."
            },
            {
              "code": "WA-TN-003",
              "commonCorrection": "Ask Parable staff to grant access instead of inviting or reactivating someone.",
              "description": "The Workspace is a dogfood or demo Workspace, where membership comes only from Parable staff-role grants."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Creates a pending invitation with the Workspace's default role.",
          "title": "Invite someone with the default role",
          "useWhen": "Use when you need to invite a new person to the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/invitations/{inviteId}": {
      "delete": {
        "description": "Cancels an invitation that has been sent but not accepted, so it can no longer be used.",
        "operationId": "UsersRevokeInviteHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "inviteId parameter",
            "in": "path",
            "name": "inviteId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Cancel an invitation",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.revoke-invite",
          "description": "Cancels an invitation that has been sent but not accepted, so it can no longer be used.",
          "doNotUseWhen": "Do not use when the person has already joined the Workspace; remove the membership instead.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose an invitation identifier returned by the selected Workspace.",
              "description": "The invitation does not exist in this Workspace."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can invite people.",
              "description": "You cannot revoke invitations in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Revokes the pending invitation.",
          "title": "Cancel an invitation",
          "useWhen": "Use when a pending invitation must no longer be accepted.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/invitations/{inviteId}/resend": {
      "post": {
        "description": "Sends a pending invitation again and pushes back its expiry.",
        "operationId": "UsersResendInviteHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "inviteId parameter",
            "in": "path",
            "name": "inviteId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Resend an invitation",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.resend-invite",
          "description": "Sends a pending invitation again and pushes back its expiry.",
          "doNotUseWhen": "Do not use when the invitation is no longer pending or when you need to create a new invitation.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a pending invitation from the selected Workspace.",
              "description": "The invitation does not exist in this Workspace."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can invite people.",
              "description": "You cannot resend invitations in this Workspace."
            },
            {
              "code": "WA-TN-003",
              "commonCorrection": "Ask Parable staff to grant access instead of inviting or reactivating someone.",
              "description": "The Workspace is a dogfood or demo Workspace, where membership comes only from Parable staff-role grants."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Resends the pending invitation and extends its expiry.",
          "title": "Resend an invitation",
          "useWhen": "Use when a pending Workspace invitation needs another delivery attempt and a new expiry.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/invites": {
      "get": {
        "description": "Lists every invitation sent for this Workspace and where each one stands.",
        "operationId": "UsersInvitesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantUserInvite"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List invitations",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.invites",
          "description": "Lists every invitation sent for this Workspace and where each one stands.",
          "doNotUseWhen": "Do not use when you need the people who have already joined the Workspace.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can view people.",
              "description": "You cannot view invitations in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Workspace invitations and their current status.",
          "title": "List invitations",
          "useWhen": "Use when you need the pending and historical invitations for the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/me": {
      "get": {
        "description": "Returns your own details in this Workspace.",
        "operationId": "UsersMeHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantUser"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read your membership here",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.me",
          "description": "Returns your own details in this Workspace.",
          "doNotUseWhen": "Do not use when you need another person’s membership details.",
          "errors": [
            {
              "code": "HTTP 401",
              "commonCorrection": "Sign in again and select the Workspace you belong to.",
              "description": "No valid signed-in session was provided."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns your membership in the selected Workspace.",
          "title": "Read your membership here",
          "useWhen": "Use when you need your own membership details in the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/user": {
      "get": {
        "description": "Returns one member of this Workspace.",
        "operationId": "UsersUserHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "userId",
            "required": true,
            "schema": {
              "description": "UUID v4 string as base62",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantUser"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read one person",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.user",
          "description": "Returns one member of this Workspace.",
          "doNotUseWhen": "Do not use when you need to search or list Workspace members.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can view people.",
              "description": "You cannot view people in this Workspace."
            },
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a person identifier from the selected Workspace.",
              "description": "The person is not a member of this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the requested Workspace member.",
          "title": "Read one person",
          "useWhen": "Use when you need one person’s membership details in the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/users": {
      "get": {
        "description": "Lists the people who have joined this Workspace. You can search by name and filter by what they are allowed to do.",
        "operationId": "UsersUsersHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "type": "number"
            }
          },
          {
            "explode": false,
            "in": "query",
            "name": "permission",
            "required": false,
            "schema": {
              "items": {
                "description": "Hierarchical permission string (e.g., 'admin.users.read')",
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantUser"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List people in the Workspace",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.users",
          "description": "Lists the people who have joined this Workspace. You can search by name and filter by what they are allowed to do.",
          "doNotUseWhen": "Do not use when you need the full details of one known person.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can view people.",
              "description": "You cannot view people in this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns matching Workspace members.",
          "title": "List people in the Workspace",
          "useWhen": "Use when you need to search or filter people who belong to the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/{userId}": {
      "delete": {
        "description": "Removes a person from this Workspace, ending their access to everything in it. Their membership is revoked, their pending invitations are cancelled, and a member who had joined is signed out. Inviting them again restores access.",
        "operationId": "UsersRemoveUserHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "userId parameter",
            "in": "path",
            "name": "userId",
            "required": true,
            "schema": {
              "description": "UUID v4 string as base62",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "type": "boolean"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Remove someone from the Workspace",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.remove-user",
          "description": "Removes a person from this Workspace, ending their access to everything in it. Their membership is revoked, their pending invitations are cancelled, and a member who had joined is signed out. Inviting them again restores access.",
          "doNotUseWhen": "Do not use when access should be temporarily suspended or restored, or to leave a Workspace yourself.",
          "errors": [
            {
              "code": "HTTP 404",
              "commonCorrection": "Choose a person identifier from the selected Workspace.",
              "description": "The person is not a member of this Workspace."
            },
            {
              "code": "HTTP 400",
              "commonCorrection": "Ask another Workspace administrator to remove you.",
              "description": "You asked to remove yourself."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Select a Workspace where you can manage people.",
              "description": "You cannot remove people from this Workspace."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Revokes the person’s Workspace membership; succeeds when it is already revoked.",
          "title": "Remove someone from the Workspace",
          "useWhen": "Use when a person must lose all access to the selected Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/{userId}/roles": {
      "patch": {
        "description": "Replaces the roles held by one member of this Workspace, which changes what they can do.",
        "operationId": "UsersUpdateTenantUserRolesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "userId parameter",
            "in": "path",
            "name": "userId",
            "required": true,
            "schema": {
              "description": "UUID v4 string as base62",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTenantUserRolesInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantUser"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Change someone's roles",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.update-tenant-user-roles",
          "description": "Replaces the roles held by one member of this Workspace, which changes what they can do.",
          "doNotUseWhen": "Do not use when you only need to suspend or restore access.",
          "errors": [
            {
              "code": "HTTP 422",
              "commonCorrection": "Choose existing tenant-scoped roles that do not exceed your authority.",
              "description": "A requested role is unavailable or cannot be assigned in this Workspace."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask a Workspace administrator with people-management permission.",
              "description": "You cannot change this member’s roles."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Replaces the member’s roles in the selected Workspace.",
          "title": "Change someone's roles",
          "useWhen": "Use when a member needs a different complete set of Workspace roles.",
          "visibility": "internal"
        }
      }
    },
    "/api/users/{userId}/status": {
      "patch": {
        "description": "Suspends, ends, or restores a person's access to this Workspace.",
        "operationId": "UsersUpdateTenantUserStatusHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "userId parameter",
            "in": "path",
            "name": "userId",
            "required": true,
            "schema": {
              "description": "UUID v4 string as base62",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTenantUserStatusInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantUser"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Suspend or restore someone's access",
        "tags": [
          "users"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "protection.people.update-tenant-user-status",
          "description": "Suspends, ends, or restores a person's access to this Workspace.",
          "doNotUseWhen": "Do not use when you need to change the member’s roles.",
          "errors": [
            {
              "code": "HTTP 409",
              "commonCorrection": "Read the member again and retry with the current status.",
              "description": "The member’s status changed while the request was in progress."
            },
            {
              "code": "HTTP 403",
              "commonCorrection": "Ask a Workspace administrator with people-management permission.",
              "description": "You cannot change member access in this Workspace."
            },
            {
              "code": "WA-TN-003",
              "commonCorrection": "Ask Parable staff to grant access instead of inviting or reactivating someone.",
              "description": "The Workspace is a dogfood or demo Workspace, where membership comes only from Parable staff-role grants."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "success": "Returns the member with the requested access status.",
          "title": "Suspend or restore someone's access",
          "useWhen": "Use when you need to suspend, end, or restore a member’s Workspace access.",
          "visibility": "internal"
        }
      }
    },
    "/api/v2/catalog": {
      "get": {
        "description": "Returns this Workspace's catalog of available data as the query layer describes it.",
        "operationId": "CatalogV2CatalogHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SemanticCatalogResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read the data catalog",
        "tags": [
          "catalog-v2"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.catalog-v2.catalog",
          "description": "Returns this Workspace's catalog of available data as the query layer describes it.",
          "doNotUseWhen": "Do not use this operation to retrieve raw table rows or change catalog metadata.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Workspace semantic catalog.",
          "title": "Read the data catalog",
          "useWhen": "Read the semantic catalog that the query layer exposes for this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/v2/catalog/provider-annotations": {
      "get": {
        "description": "Lists the notes recorded against Providers in this Workspace.",
        "operationId": "CatalogV2ProviderAnnotationsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ProviderCatalogAnnotationsResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Provider annotations",
        "tags": [
          "catalog-v2"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.catalog-v2.provider-annotations",
          "description": "Lists the notes recorded against Providers in this Workspace.",
          "doNotUseWhen": "Do not use this operation to modify annotations or retrieve the full semantic catalog.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with data catalog permission.",
              "description": "The caller cannot read the Workspace data catalog."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Workspace Provider catalog annotations.",
          "title": "List Provider annotations",
          "useWhen": "Read the current Provider annotations recorded for this Workspace catalog.",
          "visibility": "internal"
        }
      }
    },
    "/api/v2/catalog/table-stats": {
      "get": {
        "description": "Returns the row count, size, latest quality result and freshness of each Provider table in this Workspace's catalog. A value no measurement has produced yet is null.",
        "operationId": "CatalogV2TableStatsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CatalogTableStatsResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read table statistics",
        "tags": [
          "catalog-v2"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.catalog-v2.table-stats",
          "description": "Returns the row count, size, latest quality result and freshness of each Provider table in this Workspace's catalog. A value no measurement has produced yet is null.",
          "doNotUseWhen": "Do not use this operation to list tables or columns; read the data catalog for those.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns one entry per Provider table, keyed by its catalog address.",
          "title": "Read table statistics",
          "useWhen": "Show how many rows each Provider table holds, its size, its latest quality result and how fresh it is.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/connector-instances-for-vendors": {
      "get": {
        "description": "Lists this Workspace's Provider connections, one entry per Provider that has any. Items carry no Provider docs, and connector.taps is empty; read one connection for its Taps.",
        "operationId": "VendorsConnectorInstancesForVendorsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ConnectorInstancesForVendor"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Provider connections grouped by Provider",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.connector-instances-for-vendors",
          "description": "Lists this Workspace's Provider connections, one entry per Provider that has any. Items carry no Provider docs, and connector.taps is empty; read one connection for its Taps.",
          "doNotUseWhen": "Do not use this operation when individual connection details are required.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with connector view permission.",
              "description": "The caller cannot view Workspace Provider connections."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns one grouped entry for each Provider with Workspace connections.",
          "title": "List Provider connections grouped by Provider",
          "useWhen": "See configured Workspace Provider connections grouped by Provider.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/parable-vendor-groupings/{vendorSlug}": {
      "get": {
        "description": "Lists every connection method a Provider offers, such as its different products and authentication styles. No sign-in required.",
        "operationId": "VendorsParableVendorGroupingsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "vendorSlug parameter",
            "in": "path",
            "name": "vendorSlug",
            "required": true,
            "schema": {
              "description": "A URL friendly version of a string",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ParableVendorGrouping"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "List the ways of connecting to a Provider",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.parable-vendor-groupings",
          "description": "Lists every connection method a Provider offers, such as its different products and authentication styles. No sign-in required.",
          "doNotUseWhen": "Do not use this operation to inspect one specific connection method.",
          "errors": [
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the Provider slug.",
              "description": "The requested Provider was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Provider connection-method hierarchy.",
          "title": "List the ways of connecting to a Provider",
          "useWhen": "Browse every available connection method for one Provider.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/parable-vendor-groupings/{vendorSlug}/{groupingPath}": {
      "get": {
        "description": "Returns one connection method for a Provider — for example Jira Cloud via API token. No sign-in required.",
        "operationId": "VendorsParableVendorGroupingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "vendorSlug parameter",
            "in": "path",
            "name": "vendorSlug",
            "required": true,
            "schema": {
              "description": "A URL friendly version of a string",
              "type": "string"
            }
          },
          {
            "description": "groupingPath parameter",
            "in": "path",
            "name": "groupingPath",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableVendorGrouping"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Read one way of connecting to a Provider",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.parable-vendor-grouping",
          "description": "Returns one connection method for a Provider — for example Jira Cloud via API token. No sign-in required.",
          "doNotUseWhen": "Do not use this operation to list every connection method for a Provider.",
          "errors": [
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the Provider slug and grouping path.",
              "description": "The requested Provider connection method was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the requested Provider connection method or null when it does not exist.",
          "title": "Read one way of connecting to a Provider",
          "useWhen": "Inspect one Provider connection method by Provider slug and grouping path.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/parable-vendors": {
      "get": {
        "description": "Lists the Providers available on the platform, with search and paging. It says nothing about what this Workspace has actually connected.",
        "operationId": "VendorsParableVendorsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "double",
              "type": "number"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "format": "double",
              "type": "number"
            }
          },
          {
            "in": "query",
            "name": "excludeConnected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/VendorsPaginatedResponse"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "List Providers",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.parable-vendors",
          "description": "Lists the Providers available on the platform, with search and paging. It says nothing about what this Workspace has actually connected.",
          "doNotUseWhen": "Do not use this operation to list the connections already configured in this Workspace.",
          "errors": [
            {
              "code": "HTTP 400",
              "commonCorrection": "Provide valid search, limit, offset, and excludeConnected values.",
              "description": "The search or paging parameters are invalid."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns a paginated Provider catalog.",
          "title": "List Providers",
          "useWhen": "Browse available Providers, optionally searching or paging through the catalog.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/parable-vendors-with-connectors": {
      "get": {
        "description": "Lists the Providers this Workspace has at least one connection to, with those connections included. Neither the Providers nor the connections carry Provider docs, and connector.taps is empty; read one connection for its Taps.",
        "operationId": "VendorsParableVendorsWithConnectorsHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/VendorWithConnectors"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Providers this Workspace has connected",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.parable-vendors-with-connectors",
          "description": "Lists the Providers this Workspace has at least one connection to, with those connections included. Neither the Providers nor the connections carry Provider docs, and connector.taps is empty; read one connection for its Taps.",
          "doNotUseWhen": "Do not use this operation to browse all available Providers.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with connector view permission.",
              "description": "The caller cannot view Workspace Provider connections."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns connected Providers with their Workspace connections.",
          "title": "List Providers this Workspace has connected",
          "useWhen": "See the Providers that have at least one connection in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/parable-vendors/{slug}": {
      "get": {
        "description": "Returns one Provider from the platform catalog. No sign-in required.",
        "operationId": "VendorsParableVendorHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "slug parameter",
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "description": "A URL friendly version of a string",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ParableVendor"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Read a Provider",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.parable-vendor",
          "description": "Returns one Provider from the platform catalog. No sign-in required.",
          "doNotUseWhen": "Do not use this operation to inspect a Workspace Provider connection.",
          "errors": [
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the Provider slug.",
              "description": "The requested Provider was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the requested Provider or null when no matching slug exists.",
          "title": "Read a Provider",
          "useWhen": "Inspect one Provider from the platform catalog by slug.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/product-logos": {
      "get": {
        "description": "Returns registered product names, domain aliases and logo.dev lookup metadata. New Provider products are available without a frontend deployment.",
        "operationId": "VendorsProviderProductLogosHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ProviderProductLogo"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "Read product logo lookups",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.product-logos",
          "description": "Returns registered product names, domain aliases and logo.dev lookup metadata. New Provider products are available without a frontend deployment.",
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "title": "Read product logo lookups",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/provider-directory": {
      "get": {
        "description": "Returns the complete visible product catalog without setup documentation or authentication schemas. Workspace priorities apply when Workspace context is present.",
        "operationId": "VendorsProviderDirectoryHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/ProviderDirectoryEntry"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "summary": "List Provider products",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.products",
          "description": "Returns the complete visible product catalog without setup documentation or authentication schemas. Workspace priorities apply when Workspace context is present.",
          "doNotUseWhen": "Use the connection list to inspect configured Workspace connections.",
          "errors": [
            {
              "code": "HTTP 500",
              "commonCorrection": "Retry the request.",
              "description": "The product catalog could not be read."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns every visible product, with its company and configuration path.",
          "title": "List Provider products",
          "useWhen": "Browse products by function or company before configuring a connection.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/tenant-connector-credential-detail": {
      "get": {
        "description": "Returns the detail behind a failed credential check for one Provider connection, or nothing if it has never been checked.",
        "operationId": "VendorsTenantConnectorCredentialDetailHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConnectorCredentialDetail"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read why credentials failed",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.tenant-connector-credential-detail",
          "description": "Returns the detail behind a failed credential check for one Provider connection, or nothing if it has never been checked.",
          "doNotUseWhen": "Do not use this operation to validate credentials or change their values.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            },
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the credential metadata identifier.",
              "description": "The credential metadata was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns credential failure detail or null when no validation result exists.",
          "title": "Read why credentials failed",
          "useWhen": "Inspect the most recent credential-validation failure for a Provider connection.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/tenant-connector-instances": {
      "get": {
        "description": "Lists the Provider connections set up in this Workspace, and whether each one is currently working. Items carry no Provider docs. connector.taps is empty unless includeTaps is true, which adds every Tap with its schema and makes the response much larger.",
        "operationId": "VendorsTenantConnectorInstancesHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "includeTaps",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantConnectorInstance"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Provider connections",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.tenant-connector-instances",
          "description": "Lists the Provider connections set up in this Workspace, and whether each one is currently working. Items carry no Provider docs. connector.taps is empty unless includeTaps is true, which adds every Tap with its schema and makes the response much larger.",
          "doNotUseWhen": "Do not use this operation to browse the platform Provider catalog.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Workspace Provider connections and their current status, without Provider docs.",
          "title": "List Provider connections",
          "useWhen": "List every Provider connection configured in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/tenant-connector-instances-for-groupings/{groupingId}": {
      "get": {
        "description": "Lists this Workspace's Provider connections that use a particular connection method. Items carry no Provider docs, and connector.taps is empty; read one connection for its Taps.",
        "operationId": "VendorsTenantConnectorInstancesForGroupingHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "groupingId parameter",
            "in": "path",
            "name": "groupingId",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantConnectorInstance"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Provider connections using one connection method",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.tenant-connector-instances-for-grouping",
          "description": "Lists this Workspace's Provider connections that use a particular connection method. Items carry no Provider docs, and connector.taps is empty; read one connection for its Taps.",
          "doNotUseWhen": "Do not use this operation to inspect the platform definition of that connection method.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with connector view permission.",
              "description": "The caller cannot view Workspace Provider connections."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns Workspace connections for the requested method.",
          "title": "List Provider connections using one connection method",
          "useWhen": "List this Workspace’s configured connections that use one Provider connection method.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/tenant-connector-instances-for-vendors/{vendorSlug}": {
      "get": {
        "description": "Lists this Workspace's connections to a single Provider. Items carry no Provider docs, and connector.taps is empty; read one connection for its Taps.",
        "operationId": "VendorsTenantConnectorInstancesForVendorHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "vendorSlug parameter",
            "in": "path",
            "name": "vendorSlug",
            "required": true,
            "schema": {
              "description": "A URL friendly version of a string",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "items": {
                        "$ref": "#/components/schemas/TenantConnectorInstance"
                      },
                      "type": "array"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "List Provider connections for one Provider",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.tenant-connector-instances-for-vendor",
          "description": "Lists this Workspace's connections to a single Provider. Items carry no Provider docs, and connector.taps is empty; read one connection for its Taps.",
          "doNotUseWhen": "Do not use this operation to browse connections across every Provider.",
          "errors": [
            {
              "code": "HTTP 403",
              "commonCorrection": "Use an identity with connector view permission.",
              "description": "The caller cannot view Workspace Provider connections."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Workspace connections for the requested Provider.",
          "title": "List Provider connections for one Provider",
          "useWhen": "List this Workspace’s configured connections for one Provider.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/tenant-connector-instances/{id}": {
      "get": {
        "description": "Returns a single Provider connection in this Workspace.",
        "operationId": "VendorsTenantConnectorInstanceHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "id parameter",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TenantConnectorInstance"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read one Provider connection",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.tenant-connector-instance",
          "description": "Returns a single Provider connection in this Workspace.",
          "doNotUseWhen": "Do not use this operation to inspect a platform Provider definition.",
          "errors": [
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the connection identifier.",
              "description": "The requested Provider connection was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns the Provider connection or null when it is unavailable in this Workspace.",
          "title": "Read one Provider connection",
          "useWhen": "Inspect one configured Provider connection in this Workspace.",
          "visibility": "internal"
        }
      }
    },
    "/api/vendors/tenant-connector-sync-detail": {
      "get": {
        "description": "Returns the error detail from the most recent failed or partly failed sync on one Provider connection.",
        "operationId": "VendorsTenantConnectorSyncDetailHandler",
        "parameters": [
          {
            "description": "Tenant slug. Overrides subdomain-based tenant resolution when provided.",
            "in": "header",
            "name": "X-Tenant",
            "required": false,
            "schema": {
              "example": "acme",
              "type": "string"
            }
          },
          {
            "description": "Optional request correlation ID echoed back in the response.",
            "in": "header",
            "name": "X-Request-ID",
            "required": false,
            "schema": {
              "example": "550e8400-e29b-41d4-a716-446655440000",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID v4 with automatic base62 encoding for client-facing APIs",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConnectorSyncDetail"
                    },
                    "links": {
                      "$ref": "#/components/schemas/ResponseLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ResponseMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Bad request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Internal server error"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "summary": "Read why a sync failed",
        "tags": [
          "vendors"
        ],
        "x-parable-docs": {
          "audience": "workspace",
          "capability": "providers.directory.tenant-connector-sync-detail",
          "description": "Returns the error detail from the most recent failed or partly failed sync on one Provider connection.",
          "doNotUseWhen": "Do not use this operation to start a sync or change the connection.",
          "errors": [
            {
              "code": "WA-TN-001",
              "commonCorrection": "Call from a Workspace context.",
              "description": "No Workspace context was supplied."
            },
            {
              "code": "WA-RS-001",
              "commonCorrection": "Check the connection identifier.",
              "description": "The Provider connection was not found."
            }
          ],
          "lifecycle": "active",
          "mappingStatus": "mapped",
          "replay": {
            "expectedRevisionPointers": [],
            "idempotencyKeyPointers": [],
            "mode": "read_only"
          },
          "success": "Returns sync failure detail or null when no relevant failed sync exists.",
          "title": "Read why a sync failed",
          "useWhen": "Inspect the most recent failed or partially failed sync for a Provider connection.",
          "visibility": "internal"
        }
      }
    }
  },
  "servers": [
    {
      "description": "Runtime server",
      "url": "http://localhost:8080"
    }
  ]
}