{
  "schemaVersion": 1,
  "release": "0.8.3",
  "endpoint": "https://mcp.sia.vision/studio",
  "note": "Generated source catalog. Runtime feature configuration and authorization remain authoritative. Account/profile and workflow-guide tools are described separately below. Production output schemas are partial versioned envelopes.",
  "tools": [
    {
      "name": "artifact_details_save",
      "title": "Save Artifact details",
      "description": "Save exact-revision Artifact details or repair source images without generation. Preserves generated Media, provenance, immutable versions and all existing Looks. Refresh if the expectedVersion changed.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "details": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "schemaVersion": {
                "const": 1
              },
              "category": {
                "enum": [
                  "prop",
                  "clothing",
                  "accessory"
                ]
              },
              "description": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "materials": {
                "type": "string",
                "minLength": 1,
                "maxLength": 1000
              },
              "scale": {
                "type": "string",
                "minLength": 1,
                "maxLength": 500
              },
              "placement": {
                "type": "string",
                "minLength": 1,
                "maxLength": 1000
              },
              "continuityNotes": {
                "type": "string",
                "minLength": 1,
                "maxLength": 4000
              }
            },
            "required": [
              "schemaVersion",
              "category",
              "description"
            ]
          },
          "sourceAssetIds": {
            "type": "array",
            "maxItems": 16,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^[a-fA-F0-9]{24}$"
            },
            "description": "Ordered IDs of saved source images to preserve as generation inputs. Never silently omit an intended source."
          },
          "removeReferenceAssetIds": {
            "type": "array",
            "maxItems": 16,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^[a-fA-F0-9]{24}$"
            }
          }
        },
        "required": [
          "storyworldId",
          "artifactId",
          "expectedVersion",
          "title",
          "details"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "version": {
            "description": "Current mutable document version. Copy it to expectedVersion before a write.",
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "contentRevision": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "referenceRevision": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "recipeVersionId": {
            "description": "Immutable Look recipe identity; distinct from the mutable document version.",
            "type": "string"
          },
          "generationEligible": {
            "type": "boolean"
          },
          "lookEligible": {
            "type": "boolean"
          },
          "candidates": {
            "description": "Saved candidate images. Inspect an actual image before selecting it.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                }
              },
              "additionalProperties": {}
            }
          },
          "selectedLookVersionId": {
            "type": [
              "string",
              "null"
            ]
          },
          "activeImageRequest": {
            "description": "Original preparing/admitted image request to reconcile after a timeout; do not replace it.",
            "anyOf": [
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          },
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "jobId": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                }
              },
              "required": [
                "jobId",
                "status"
              ],
              "additionalProperties": {}
            }
          },
          "nextActions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "studioUrl": {
            "description": "Canonical authenticated Studio editor for this saved asset.",
            "type": "string"
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          }
        },
        "required": [
          "schemaVersion",
          "artifactId",
          "storyworldId"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_draft_create",
      "title": "Save an Artifact draft",
      "description": "Create one reusable prop, clothing or accessory from a concise brief and optional saved reference images. Search first. Choose useful details from the brief; do not interview the user for every field. Same operationId returns the original draft. Generated files remain Media, and Character identity is unchanged.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "details": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "schemaVersion": {
                "const": 1
              },
              "category": {
                "enum": [
                  "prop",
                  "clothing",
                  "accessory"
                ]
              },
              "description": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "materials": {
                "type": "string",
                "minLength": 1,
                "maxLength": 1000
              },
              "scale": {
                "type": "string",
                "minLength": 1,
                "maxLength": 500
              },
              "placement": {
                "type": "string",
                "minLength": 1,
                "maxLength": 1000
              },
              "continuityNotes": {
                "type": "string",
                "minLength": 1,
                "maxLength": 4000
              }
            },
            "required": [
              "schemaVersion",
              "category",
              "description"
            ]
          },
          "sourceAssetIds": {
            "type": "array",
            "maxItems": 16,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^[a-fA-F0-9]{24}$"
            },
            "description": "Ordered IDs of saved source images to preserve as generation inputs. Never silently omit an intended source."
          }
        },
        "required": [
          "storyworldId",
          "operationId",
          "title",
          "details"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "title": {
            "type": "string"
          },
          "studioUrl": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "artifactId",
          "storyworldId",
          "title"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_image_generate",
      "title": "Create an Artifact design reference",
      "description": "Use the existing Studio image provider and account billing to create one review candidate. Use saved sources by default, selected references for refinement, or explicit text-only mode. Optional Character and Production context are frozen; navigation cannot retarget the result. All intended inputs must fit the four-image budget; none are dropped. Poll/recover the original job after uncertainty. Never automatically submit a paid replacement.",
      "requiredScopes": [
        "account:read",
        "studio:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "sourceMode": {
            "enum": [
              "sources",
              "selected",
              "text"
            ],
            "description": "Use saved sources by default, selected references for refinement, or text only when explicitly intended."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "direction": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "aspect": {
            "enum": [
              "1:1",
              "16:9",
              "9:16"
            ]
          },
          "production": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "productionId": {
                "type": "string",
                "pattern": "^[a-fA-F0-9]{24}$",
                "description": "ID of the saved Production whose asset context must remain pinned."
              },
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
              },
              "bindingId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "shotId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200,
                "description": "Exact originating shot ID; navigation must not retarget an admitted generation."
              }
            },
            "required": [
              "productionId",
              "expectedVersion"
            ],
            "description": "Optional originating Production context to freeze. Does not implicitly attach the result to a shot."
          }
        },
        "required": [
          "storyworldId",
          "artifactId",
          "expectedVersion",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_image_preview",
      "title": "Inspect an Artifact image",
      "description": "Display the actual saved linked image before selecting it. Returns a preview receipt bound to the current brief and original bytes. A delivered preview is not a review, human approval or canon.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          }
        },
        "required": [
          "storyworldId",
          "artifactId",
          "assetId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "entityId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "previewFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "schemaVersion",
          "entityId",
          "assetId",
          "previewFingerprint"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_image_request_close",
      "title": "Close an unsent Artifact image preparation",
      "description": "Close only the exact owned provider-free preparation. A tombstone prevents a late HTTP response from submitting it. If admission already committed, returns the original job; does not cancel or replace a paid dispatch.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "requestId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "storyworldId",
          "artifactId",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "state": {
            "type": "string"
          },
          "jobId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{24}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schemaVersion",
          "state",
          "jobId"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_image_request_get",
      "title": "Read an original Artifact image request",
      "description": "Read the original preparation or admitted job under the same operation ID after a timeout or reload. A preparation is provider-free; resume identical inputs. A closed preparation cannot later submit a paid job.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          }
        },
        "required": [
          "storyworldId",
          "artifactId",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "state": {
            "type": "string"
          },
          "jobId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{24}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schemaVersion",
          "state",
          "jobId"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_job_get",
      "title": "Read an original Artifact image job",
      "description": "Read the original native image receipt and frozen destination. Poll this job instead of generating again. Completed means original reservation settled and Media saved.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "storyworldId",
          "artifactId",
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_job_recover",
      "title": "Recover an original Artifact image job",
      "description": "Requeue only the original task. A permanent submission marker permits retained-output recovery, never another provider POST. An attempt with no retained output stays needs_reconciliation.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "storyworldId",
          "artifactId",
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_reference_select",
      "title": "Select an inspected Artifact reference",
      "description": "After inspecting the actual image, select it for future Look generation. Uses its exact current preview receipt. Records agent selection, never human approval or canon; preserves other references and old Looks.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          },
          "previewFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Copy the exact receipt returned by previewing this image for the current brief. Do not fabricate it or reuse a stale preview."
          },
          "reviewed": {
            "const": true,
            "description": "True only after inspecting the actual current image. This records agent inspection, not human approval or canon."
          }
        },
        "required": [
          "storyworldId",
          "artifactId",
          "assetId",
          "previewFingerprint",
          "reviewed"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "entityId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "entityId",
          "assetId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "artifact_workflow_get",
      "title": "Read an Artifact workflow",
      "description": "Read saved Artifact details, source and selected-reference sets, candidate images, eligibility and original image jobs. Missing sources remain repairable. No generation or approval.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
          }
        },
        "required": [
          "storyworldId",
          "artifactId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "version": {
            "description": "Current mutable document version. Copy it to expectedVersion before a write.",
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "contentRevision": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "referenceRevision": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "recipeVersionId": {
            "description": "Immutable Look recipe identity; distinct from the mutable document version.",
            "type": "string"
          },
          "generationEligible": {
            "type": "boolean"
          },
          "lookEligible": {
            "type": "boolean"
          },
          "candidates": {
            "description": "Saved candidate images. Inspect an actual image before selecting it.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                }
              },
              "additionalProperties": {}
            }
          },
          "selectedLookVersionId": {
            "type": [
              "string",
              "null"
            ]
          },
          "activeImageRequest": {
            "description": "Original preparing/admitted image request to reconcile after a timeout; do not replace it.",
            "anyOf": [
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          },
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "jobId": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                }
              },
              "required": [
                "jobId",
                "status"
              ],
              "additionalProperties": {}
            }
          },
          "nextActions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "studioUrl": {
            "description": "Canonical authenticated Studio editor for this saved asset.",
            "type": "string"
          },
          "artifactId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          }
        },
        "required": [
          "schemaVersion",
          "artifactId",
          "storyworldId"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_audition_generate",
      "title": "Generate one Character audio audition",
      "description": "Generate one retained ElevenLabs audition using the saved voice and connected account billing. Pricing/reservation is internal, with no per-job quote prompt. The same operationId never authorizes a second submission. Returns jobId; audio generation alone does not animate a mouth or select a scene take.",
      "requiredScopes": [
        "account:read",
        "studio:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000
          },
          "stability": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "similarityBoost": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "operationId",
          "text"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_cast_draft",
      "title": "Cast a character draft from a saved reference",
      "description": "Create a new reusable character draft with details and one saved identity reference in an authorized Storyworld. Search before creating. Reuse operationId for retries; changed input needs a new operationId. Creates no paid media, approvals, canon, production pins or existing-character edits.",
      "requiredScopes": [
        "account:read",
        "character:draft"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_-]{16,100}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "referenceAssetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved identity reference image, after inspecting its actual pixels and source record."
          },
          "folderId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "details": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "description": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "appearance": {
                "type": "string",
                "minLength": 1,
                "maxLength": 4000
              },
              "personality": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "backstory": {
                "type": "string",
                "minLength": 1,
                "maxLength": 4000
              },
              "role": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200,
                "description": "The reference view being inspected or assigned; keep the candidate and its receipt tied to this role."
              },
              "ageRange": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": []
          }
        },
        "required": [
          "storyworldId",
          "operationId",
          "name",
          "referenceAssetId",
          "details"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "documentId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "bibleId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "approvalStatus": {
            "type": "string",
            "const": "draft"
          },
          "referenceAssetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "referenceReviewStatus": {
            "type": "string",
            "const": "pending"
          },
          "referencePin": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "nextActions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "studioUrl": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "characterId",
          "storyworldId",
          "documentId",
          "bibleId",
          "approvalStatus",
          "referenceAssetId",
          "referenceReviewStatus",
          "referencePin",
          "nextActions",
          "studioUrl"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_get",
      "title": "Inspect a character and its references",
      "description": "Read saved character details, reference provenance and review status, and the canonical Studio link.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          }
        },
        "required": [
          "storyworldId",
          "characterId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "character": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          }
        },
        "required": [
          "schemaVersion",
          "character"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_job_get",
      "title": "Inspect a Character workflow job",
      "description": "Read durable MCP job state after rechecking current account, grant and Storyworld access. A submitted provider job is still pending. Never treat timeout or running state as permission to generate again. Reconnect does not revive a revoked queued job.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_job_recover",
      "title": "Recover retained Character job state",
      "description": "Reconcile the original operation with native retained receipts/provider status. Never starts a new paid generation. Use after a lost response or uncertain state; completed audio is read from its immutable execution record, not repriced under a new voice.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_list",
      "title": "Find saved characters",
      "description": "Search saved characters in one authorized Storyworld before creating a new identity.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "query": {
            "type": "string",
            "maxLength": 200
          },
          "after": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": [
          "storyworldId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "nextAfter": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{24}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schemaVersion",
          "items",
          "nextAfter"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_media_preview",
      "title": "Play a saved Character audition or casting preview",
      "description": "Present retained Character media without generating anything. A complete verified audition up to 512 KiB is returned as native audio. Larger audio and casting video return a sign-in-protected Studio viewer link; no public storage URL or base64 transcript. Reuse saved results before generating more.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "assetId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "mimeType": {
            "type": "string"
          },
          "totalBytes": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "generation": {
            "type": "string"
          },
          "presentation": {
            "type": "string",
            "enum": [
              "audio_inline",
              "studio_viewer"
            ]
          },
          "studioUrl": {
            "type": "string"
          },
          "matchesAssignedVoice": {
            "type": "boolean",
            "const": false
          },
          "audioSource": {
            "type": "string",
            "const": "provider_native"
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "characterId",
          "assetId",
          "sha256",
          "mimeType",
          "totalBytes",
          "generation",
          "presentation",
          "studioUrl"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_media_read",
      "title": "Read retained Character media",
      "description": "Programmatic byte-range download of retained audition/video media after checking current Storyworld access. Prefer character_media_preview for conversation playback. Use a file adapter to keep base64 out of model context, pin generation across chunks and verify the final SHA-256. No generation, selection or billing.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "description": "Byte offset for programmatic download, starting at zero. Keep range bytes out of the chat transcript."
          },
          "length": {
            "type": "integer",
            "minimum": 1,
            "maximum": 524288,
            "description": "Maximum bytes in this programmatic range. Use character_media_preview for ordinary audition/video sharing."
          },
          "generation": {
            "type": "string",
            "pattern": "^[0-9]+$",
            "description": "Immutable storage generation from the first media range; reuse it for every subsequent range."
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "assetId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "mimeType": {
            "type": "string"
          },
          "totalBytes": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 100000000
          },
          "generation": {
            "type": "string",
            "pattern": "^\\d+$"
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "nextOffset": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "dataBase64": {
            "type": "string",
            "maxLength": 699052
          }
        },
        "required": [
          "schemaVersion",
          "assetId",
          "sha256",
          "mimeType",
          "totalBytes",
          "generation",
          "offset",
          "nextOffset",
          "dataBase64"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_reference_assign",
      "title": "Assign an inspected Character reference",
      "description": "Assign the exact inspected linked image to a Character reference role using its current fingerprint. Prior candidates remain retained. This records MCP-agent review for the connected account; it does not approve canon or edit Production pins.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "role": {
            "type": "string",
            "enum": [
              "identity_portrait",
              "waist_up",
              "full_body",
              "expression_sheet"
            ],
            "description": "The reference view being inspected or assigned; keep the candidate and its receipt tied to this role."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          },
          "assignmentFingerprint": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          },
          "assetReviewed": {
            "const": true,
            "type": "boolean"
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "role",
          "assetId",
          "assignmentFingerprint",
          "assetReviewed"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "role": {
            "type": "string"
          },
          "reviewStatus": {
            "type": "string"
          },
          "assignmentFingerprint": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "characterId",
          "assetId",
          "role",
          "reviewStatus",
          "assignmentFingerprint"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_reference_generate",
      "title": "Generate missing Character views",
      "description": "Queue one bounded reference generation on the connected account billing. Uses the saved identity image and current reference set; missing roles are frozen server-side. Does not ask for a per-job quote. Returns a durable jobId; poll character_job_get. Never submit another operation after an uncertain outcome; recover this one. Generated candidates are not automatically reviewed or canon.",
      "requiredScopes": [
        "account:read",
        "studio:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "identity_portrait",
                "waist_up",
                "full_body",
                "expression_sheet"
              ]
            },
            "minItems": 1,
            "maxItems": 4,
            "uniqueItems": true,
            "description": "Only the missing/requested reference views. Reuse views already saved and suitable."
          },
          "modelId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "operationId",
          "roles"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_reference_options_get",
      "title": "Inspect reference-role candidates",
      "description": "List linked image candidates for one required Character reference role with current assignment fingerprints. Preview the exact image before assignment. No generation or billing.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "role": {
            "type": "string",
            "enum": [
              "identity_portrait",
              "waist_up",
              "full_body",
              "expression_sheet"
            ],
            "description": "The reference view being inspected or assigned; keep the candidate and its receipt tied to this role."
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "role"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "role": {
            "type": "string"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "optionCount": {
            "type": "number"
          },
          "optionsTruncated": {
            "type": "boolean"
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "characterId",
          "role",
          "options",
          "optionCount",
          "optionsTruncated"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_setup_finish",
      "title": "Save Character setup completion",
      "description": "Finish the saved Character setup using its current version and progress timestamp. Preserves reference/voice writes and records skipped optional steps honestly. Setup complete does not approve canon, select a Production take or place the Character on a canvas.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "expectedUpdatedAt": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "operationId",
          "expectedVersion",
          "expectedUpdatedAt"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string",
            "const": "complete"
          },
          "setup": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "productionApprovalUnchanged": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "schemaVersion",
          "characterId",
          "status",
          "setup",
          "productionApprovalUnchanged"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_video_generate",
      "title": "Generate one speaking-video candidate",
      "description": "Submit one speaking-video candidate from the approved Character reference, billed to this account without a per-job quote prompt. This route uses provider-native audio and does not use the chosen ElevenLabs voice. Returns a durable jobId; provider acceptance is not a retained video or review approval. Poll/recover the same operation, never automatically submit another. Only when the user explicitly requests one fresh attempt despite an unresolved original, supply replaceUncertainJobId with that original MCP job ID and use one new operationId. This preserves the original unknown outcome and reservation; it is not a refund or automatic retry.",
      "requiredScopes": [
        "account:read",
        "studio:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 250
          },
          "imageAssetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "replaceUncertainJobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "operationId",
          "text"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_voice_assign",
      "title": "Assign the inspected voice",
      "description": "Save a current, inspected workspace voice option and synchronize the Character Bible. Requires the exact selection fingerprint and previewReviewed=true. If the response is lost, inspect character_workflow_get before assigning again. Does not generate speech, clone/import voices or change existing scene audio.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "providerVoiceId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "selectionFingerprint": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Use the current voice/reference option fingerprint from the corresponding options tool."
          },
          "previewReviewed": {
            "const": true,
            "type": "boolean"
          },
          "expectedRevisionId": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 200
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "providerVoiceId",
          "selectionFingerprint",
          "previewReviewed",
          "expectedRevisionId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "assigned": {
            "type": "boolean"
          }
        },
        "required": [
          "schemaVersion",
          "assigned"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_voice_autoselect",
      "title": "Choose a provisional Character voice",
      "description": "Choose and save a suitable existing workspace voice from a brief preference, without asking the user for a voice ID or claiming anyone listened to a preview. Saves the actual Character default and synchronizes its Bible; the choice is provisional and can be changed later in Studio. Preserves an already-saved default. No cloning, importing, speech generation or billing. Retry only the same operationId; uncertain assignment is reconciled using its MCP-linked audit revision, never silently repeated. Use this for delegated automatic creation; character_voice_assign retains its manual preview-review requirement.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "preference": {
            "type": "string",
            "maxLength": 1000
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "assigned": {
            "type": "boolean"
          },
          "provisional": {
            "type": "boolean"
          },
          "previewReviewed": {
            "type": "boolean",
            "const": false
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "assigned",
          "provisional",
          "previewReviewed",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_voice_options_get",
      "title": "Find Character voice options",
      "description": "List available workspace voices, provider labels, previews and current selection fingerprints for this Character. No speech generation, import, cloning or credits. Inspect a preview before assigning.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "query": {
            "type": "string",
            "maxLength": 200
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 30
          }
        },
        "required": [
          "storyworldId",
          "characterId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "voices": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "schemaVersion",
          "voices"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_voice_preview",
      "title": "Preview a voice option",
      "description": "Read the provider preview for one current voice selection fingerprint. Returns bounded audio bytes; no paid speech generation. Use the current fingerprint when assigning.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "providerVoiceId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "selectionFingerprint": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Use the current voice/reference option fingerprint from the corresponding options tool."
          }
        },
        "required": [
          "storyworldId",
          "characterId",
          "providerVoiceId",
          "selectionFingerprint"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "providerVoiceId": {
            "type": "string"
          },
          "selectionFingerprint": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "providerVoiceId",
          "selectionFingerprint"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "character_workflow_get",
      "title": "Inspect saved Character workflow state",
      "description": "Read authoritative setup, reference roles/review, saved voice, retained auditions/video, active operations and next valid actions. Provider submission is not completion. Speaking video uses provider-native audio, not the selected ElevenLabs voice. Large media stays in managed storage.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          }
        },
        "required": [
          "storyworldId",
          "characterId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "version": {
            "type": "number"
          },
          "setup": {
            "anyOf": [
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          },
          "references": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "requiredReferenceRoles": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "voice": {
            "anyOf": [
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          },
          "operations": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "auditions": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "videos": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "videoCapability": {
            "type": "object",
            "properties": {
              "audioSource": {
                "type": "string",
                "const": "provider_native"
              },
              "audioReferenceUsed": {
                "type": "boolean",
                "const": false
              },
              "matchesAssignedVoice": {
                "type": "boolean",
                "const": false
              }
            },
            "required": [
              "audioSource",
              "audioReferenceUsed",
              "matchesAssignedVoice"
            ],
            "additionalProperties": false
          },
          "nextActions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "studioUrl": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "characterId",
          "version",
          "setup",
          "references",
          "requiredReferenceRoles",
          "voice",
          "operations",
          "auditions",
          "videos",
          "videoCapability",
          "nextActions",
          "studioUrl"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "library_search",
      "title": "Search saved Studio work",
      "description": "Search names, descriptions, aliases and tags in currently accessible Storyworlds. Sort newest-added, recently-updated or by name. Returns safe saved records, server-recorded creation channel and a checked-at change watermark. Reuse saved assets before creating. Source not recorded means unknown; an MCP label is not human approval. No generation, copying or Production pin changes.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "type": "string",
            "maxLength": 3000
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "nodeTypes": {
            "type": "array",
            "minItems": 1,
            "maxItems": 8,
            "items": {
              "type": "string",
              "enum": [
                "CHARACTER",
                "LOCATION",
                "ARTIFACT",
                "COLLECTION",
                "MEDIA",
                "SCENE",
                "NOTE",
                "PROMPT"
              ]
            }
          },
          "search": {
            "type": "string",
            "maxLength": 120
          },
          "sort": {
            "type": "string",
            "enum": [
              "updated",
              "newest",
              "name"
            ]
          }
        },
        "required": []
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ]
          },
          "freshness": {
            "type": "object",
            "properties": {
              "checkedAt": {
                "type": "string"
              },
              "revision": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "authorizationScope": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "totalItems": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "checkedAt",
              "revision",
              "authorizationScope",
              "totalItems"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "schemaVersion",
          "items",
          "nextCursor",
          "freshness"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "library_status",
      "title": "Check the saved-work change watermark",
      "description": "Check the exact saved-work page using the same Storyworld, types, search, sort, cursor and limit as library_search. Compare revision for changes to that page or the matching count. authorizationScope changes require discarding cached results immediately. This is a dated check, not a live subscription or approval, and does not inspect unloaded pages. Always rechecks current membership.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "type": "string",
            "maxLength": 3000
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "nodeTypes": {
            "type": "array",
            "minItems": 1,
            "maxItems": 8,
            "items": {
              "type": "string",
              "enum": [
                "CHARACTER",
                "LOCATION",
                "ARTIFACT",
                "COLLECTION",
                "MEDIA",
                "SCENE",
                "NOTE",
                "PROMPT"
              ]
            }
          },
          "search": {
            "type": "string",
            "maxLength": 120
          },
          "sort": {
            "type": "string",
            "enum": [
              "updated",
              "newest",
              "name"
            ]
          }
        },
        "required": []
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "checkedAt": {
            "type": "string"
          },
          "revision": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "authorizationScope": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "totalItems": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "schemaVersion",
          "checkedAt",
          "revision",
          "authorizationScope",
          "totalItems"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "location_draft_create",
      "title": "Save a Location draft",
      "description": "Create one text-led Location draft in an existing Storyworld. Choose concise details from the user brief; search saved work first. Identical operationId retries reuse the same Location. No images, credits, placements or approvals are created. Use reference_image_upload for an incoming image, then location_reference_generate.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000
          },
          "sourceAssetIds": {
            "type": "array",
            "uniqueItems": true,
            "maxItems": 4,
            "items": {
              "type": "string",
              "pattern": "^[a-fA-F0-9]{24}$"
            },
            "description": "Ordered IDs of saved source images to preserve as generation inputs. Never silently omit an intended source."
          },
          "locationType": {
            "type": "string",
            "enum": [
              "interior",
              "exterior",
              "vehicle",
              "virtual"
            ]
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          }
        },
        "required": [
          "storyworldId",
          "title",
          "description",
          "locationType",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "created": {
            "type": "boolean"
          },
          "reviewStatus": {
            "type": "string",
            "const": "draft"
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "locationId",
          "created",
          "reviewStatus"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "location_job_get",
      "title": "Check an original Location job",
      "description": "Read the original admitted Location job, retained result and recovery state. A timeout is not proof of failure. Do not create another generation when the original outcome is uncertain.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Location being inspected or continued."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "storyworldId",
          "locationId",
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "location_job_recover",
      "title": "Recover an original Location receipt",
      "description": "Reconcile the same native Location generation receipt without submitting generation. Completed/partial images remain saved; running or uncertain receipts remain explicit. This cannot generate missing views or retry a provider. Start another stage only after the prior attempt conclusively ended and the new plan is read and frozen.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Location being inspected or continued."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "storyworldId",
          "locationId",
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "location_reference_assign",
      "title": "Assign a saved Location image as an unapproved candidate",
      "description": "Use one exact already-linked image for a Location role after agent inspection. Requires its current native assignment fingerprint and issued preview fingerprint. Keeps native distinct-role, locked-reference and membership checks; creates no images, jobs, credits or approval. New assignments remain unapproved; an identical existing assignment retains its current review state. A completed receipt replays under the same operationId. If the response is lost before a receipt is saved, read current roles/options to reconcile the saved state; never blindly resubmit assignment.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Location being inspected or continued."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          },
          "role": {
            "type": "string",
            "enum": [
              "location_establishing",
              "floor_plan",
              "lighting_state"
            ],
            "description": "The reference view being inspected or assigned; keep the candidate and its receipt tied to this role."
          },
          "assignmentFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "previewFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Copy the exact receipt returned by previewing this image for the current brief. Do not fabricate it or reuse a stale preview."
          },
          "assetReviewed": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "storyworldId",
          "locationId",
          "operationId",
          "assetId",
          "role",
          "assignmentFingerprint",
          "previewFingerprint",
          "assetReviewed"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "reviewStatus": {
            "type": "string"
          },
          "approvalGranted": {
            "type": "boolean",
            "const": false
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "locationId",
          "assetId",
          "reviewStatus",
          "approvalGranted"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "location_reference_generate",
      "title": "Generate the next Location reference stage",
      "description": "Continue the existing Location workflow using account billing: one establishing image first, then inspect it via location_reference_get, then the missing layout/lighting views sequentially. Read current versions first. Sources condition only establishing generation; ordered authorities and every exact source are retained. Maximum four sources, never truncated. Derivatives use only the inspected establishing anchor. Default candidates remain unapproved; no automatic paid retries. Reuse the original operationId and inspect/recover its job after uncertain responses. Do not replace an existing establishing view unless requested.",
      "requiredScopes": [
        "account:read",
        "studio:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Location being inspected or continued."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "expectedBibleUpdatedAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "referenceSetId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_-]{1,100}$"
          },
          "stage": {
            "type": "string",
            "enum": [
              "establishing",
              "derivatives"
            ]
          },
          "anchorFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Use the inspected establishing-image fingerprint before generating dependent Location views."
          },
          "anchorReviewed": {
            "type": "boolean",
            "description": "True only after the agent has inspected the actual establishing image. Delivery alone is not review."
          },
          "textOnly": {
            "type": "boolean"
          },
          "expectedDocumentVersion": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Copy the current document version from the latest workflow read before changing the saved reference."
          },
          "replaceEstablishing": {
            "type": "boolean"
          },
          "sources": {
            "type": "array",
            "maxItems": 4,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "assetId": {
                  "type": "string",
                  "pattern": "^[a-fA-F0-9]{24}$",
                  "description": "ID of an already saved and linked Media record returned by this workflow."
                },
                "version": {
                  "type": "integer",
                  "minimum": 1
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                },
                "generation": {
                  "type": "string",
                  "pattern": "^[0-9]+$",
                  "description": "Immutable storage generation from the first media range; reuse it for every subsequent range."
                },
                "authority": {
                  "type": "string",
                  "enum": [
                    "architecture",
                    "materials",
                    "lighting",
                    "detail"
                  ]
                },
                "notes": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                }
              },
              "required": [
                "assetId",
                "version",
                "sha256",
                "generation",
                "authority"
              ]
            }
          }
        },
        "required": [
          "storyworldId",
          "locationId",
          "operationId",
          "expectedVersion",
          "expectedDocumentVersion",
          "expectedBibleUpdatedAt",
          "referenceSetId",
          "stage"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "location_reference_get",
      "title": "Inspect a Location reference",
      "description": "Display one actual saved, linked Location image. Returns original byte identity and a preview fingerprint bound to the current Location/Bible/reference set. Inspect architecture and layout before using this fingerprint for derivatives. Delivery is a preview receipt, not review, human approval or canon. Declare anchorReviewed=true only after inspecting this actual image.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Location being inspected or continued."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          }
        },
        "required": [
          "storyworldId",
          "locationId",
          "assetId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "inspectionFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "generation": {
            "type": "string"
          },
          "humanApproval": {
            "type": "boolean",
            "const": false
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "locationId",
          "assetId",
          "sha256",
          "inspectionFingerprint",
          "generation",
          "humanApproval"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "location_reference_options_get",
      "title": "Read linked Location reference options",
      "description": "List up to fifty saved, linked image candidates for one Location role with exact native assignment fingerprints. No generation or approval. Display the chosen image with location_reference_get before assigning it.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Location being inspected or continued."
          },
          "role": {
            "type": "string",
            "enum": [
              "location_establishing",
              "floor_plan",
              "lighting_state"
            ],
            "description": "The reference view being inspected or assigned; keep the candidate and its receipt tied to this role."
          }
        },
        "required": [
          "storyworldId",
          "locationId",
          "role"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "role": {
            "type": "string"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "locationId",
          "role",
          "options"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "location_workflow_get",
      "title": "Read a Location workflow",
      "description": "Read saved Location details, active reference set/Bible revision, unapproved references, missing roles and original jobs. Use library_search with LOCATION for discovery. This does not change Production asset pins or approve imagery.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Location being inspected or continued."
          }
        },
        "required": [
          "storyworldId",
          "locationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "locationId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "title": {
            "type": "string"
          },
          "version": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "references": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "referenceSetId": {
            "type": "string"
          },
          "bibleUpdatedAt": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "locationId",
          "title",
          "version",
          "references",
          "referenceSetId",
          "bibleUpdatedAt"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_draft_create",
      "title": "Prepare a Character Look",
      "description": "Create a reusable Look recipe from an exact Character version and up to three Artifacts with selected references. Choose sensible placement and styling defaults. Freezes versions separately from the Character Bible/voice; no rendering or shot changes. If a Production is supplied, uses its pinned Character and active use grant. Retry identical operationId.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "production": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "productionId": {
                "type": "string",
                "pattern": "^[a-fA-F0-9]{24}$",
                "description": "ID of the saved Production whose asset context must remain pinned."
              },
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
              },
              "bindingId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              }
            },
            "required": [
              "productionId",
              "expectedVersion",
              "bindingId"
            ],
            "description": "Optional originating Production context to freeze. Does not implicitly attach the result to a shot."
          },
          "ingredients": {
            "type": "array",
            "minItems": 1,
            "maxItems": 3,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "artifactId": {
                  "type": "string",
                  "pattern": "^[a-fA-F0-9]{24}$",
                  "description": "ID of the reusable prop, clothing or accessory, distinct from its Media image IDs."
                },
                "placement": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 1000
                },
                "state": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 1000
                }
              },
              "required": [
                "artifactId",
                "placement"
              ]
            }
          },
          "direction": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          }
        },
        "required": [
          "storyworldId",
          "operationId",
          "title",
          "characterId",
          "ingredients"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "studioUrl": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "lookId",
          "storyworldId"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_image_generate",
      "title": "Render a Character Look fit reference",
      "description": "Generate one composite fit image through the existing Studio image workflow using one Character identity image and every selected reference for each Artifact. Preserve identity, voice and old shots. Freeze the originating Production/shot and recipe before enqueueing. Display the completed image and select it after inspection. No paid automatic retries or silent reference truncation.",
      "requiredScopes": [
        "account:read",
        "studio:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "direction": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "aspect": {
            "enum": [
              "1:1",
              "16:9",
              "9:16"
            ]
          },
          "production": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "productionId": {
                "type": "string",
                "pattern": "^[a-fA-F0-9]{24}$",
                "description": "ID of the saved Production whose asset context must remain pinned."
              },
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
              },
              "bindingId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "shotId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200,
                "description": "Exact originating shot ID; navigation must not retarget an admitted generation."
              }
            },
            "required": [
              "productionId",
              "expectedVersion"
            ],
            "description": "Optional originating Production context to freeze. Does not implicitly attach the result to a shot."
          }
        },
        "required": [
          "storyworldId",
          "lookId",
          "expectedVersion",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_image_preview",
      "title": "Inspect a Look fit image",
      "description": "Display the actual composite image from this exact Look recipe before saving a Look version. A preview receipt is not human approval or canon.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          }
        },
        "required": [
          "storyworldId",
          "lookId",
          "assetId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "entityId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "previewFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "schemaVersion",
          "entityId",
          "assetId",
          "previewFingerprint"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_image_request_close",
      "title": "Close an unsent Look image preparation",
      "description": "Close only the exact owned provider-free preparation, preventing a late request from submitting it. If a job is already admitted, returns that original job for recovery.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "requestId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "storyworldId",
          "lookId",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "state": {
            "type": "string"
          },
          "jobId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{24}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schemaVersion",
          "state",
          "jobId"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_image_request_get",
      "title": "Read an original Look image request",
      "description": "Reconcile the original preparing, admitted or closed request by its frozen operation ID. Does not generate a replacement.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          }
        },
        "required": [
          "storyworldId",
          "lookId",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "state": {
            "type": "string"
          },
          "jobId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{24}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schemaVersion",
          "state",
          "jobId"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_job_get",
      "title": "Read an original Look image job",
      "description": "Read original native job, retained result and frozen Character/Artifact/Production context. Poll instead of creating another image attempt.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "storyworldId",
          "lookId",
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_job_recover",
      "title": "Recover an original Look image job",
      "description": "Recover only the original task/output/reservation. A submitted or uncertain attempt cannot make another provider POST. No replacement job is created.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "storyworldId",
          "lookId",
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "jobId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_list_for_character",
      "title": "Find a Character’s saved Looks",
      "description": "List exact-Character Looks in one accessible Storyworld, with draft, image-to-review and saved-image states. Reuse these before creating another Look. Returns safe saved records, not source images or new generation. Preview and Production attachment still check current permissions.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the exact saved Character to reuse; do not create a new identity for an outfit or accessory."
          },
          "search": {
            "type": "string",
            "maxLength": 120
          },
          "sort": {
            "enum": [
              "newest",
              "updated",
              "name"
            ]
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": [
          "storyworldId",
          "characterId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "characterId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "checkedAt": {
            "type": "string"
          },
          "truncated": {
            "type": "boolean"
          },
          "studioUrl": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "lookId": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{24}$"
                },
                "title": {
                  "type": "string"
                },
                "version": {
                  "type": "number"
                },
                "recipeVersionId": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "saved",
                    "image_to_review",
                    "draft"
                  ]
                },
                "reviewChannel": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "studioUrl": {
                  "type": "string"
                }
              },
              "required": [
                "lookId",
                "title",
                "version",
                "recipeVersionId",
                "status",
                "reviewChannel"
              ],
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "schemaVersion",
          "characterId",
          "storyworldId",
          "checkedAt",
          "truncated",
          "items"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_reference_select",
      "title": "Save an inspected Look version",
      "description": "After inspecting the actual fit image, retain an immutable composite Look version with exact Character and Artifact ingredients. Records agent review; does not change Character identity, voice or any Production shot. Same preview receipt replays without another version.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          },
          "previewFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Copy the exact receipt returned by previewing this image for the current brief. Do not fabricate it or reuse a stale preview."
          },
          "reviewed": {
            "const": true,
            "description": "True only after inspecting the actual current image. This records agent inspection, not human approval or canon."
          }
        },
        "required": [
          "storyworldId",
          "lookId",
          "assetId",
          "previewFingerprint",
          "reviewed"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "entityId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "schemaVersion",
          "entityId",
          "assetId",
          "status"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "look_workflow_get",
      "title": "Read a Character Look",
      "description": "Read exact Character/Artifact ingredients, saved composite fit candidates and reviewed Look versions. A recipe alone is a draft. Selected composite versions can later be attached to matching Production shots.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
          }
        },
        "required": [
          "storyworldId",
          "lookId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "version": {
            "description": "Current mutable document version. Copy it to expectedVersion before a write.",
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "contentRevision": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "referenceRevision": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "recipeVersionId": {
            "description": "Immutable Look recipe identity; distinct from the mutable document version.",
            "type": "string"
          },
          "generationEligible": {
            "type": "boolean"
          },
          "lookEligible": {
            "type": "boolean"
          },
          "candidates": {
            "description": "Saved candidate images. Inspect an actual image before selecting it.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                }
              },
              "additionalProperties": {}
            }
          },
          "selectedLookVersionId": {
            "type": [
              "string",
              "null"
            ]
          },
          "activeImageRequest": {
            "description": "Original preparing/admitted image request to reconcile after a timeout; do not replace it.",
            "anyOf": [
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          },
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "jobId": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                }
              },
              "required": [
                "jobId",
                "status"
              ],
              "additionalProperties": {}
            }
          },
          "nextActions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "studioUrl": {
            "description": "Canonical authenticated Studio editor for this saved asset.",
            "type": "string"
          },
          "lookId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          }
        },
        "required": [
          "schemaVersion",
          "lookId",
          "storyworldId"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "production_assets_save",
      "title": "Pin the chosen Character and Location versions",
      "description": "Pin exact inspected source versions and bind them to this Production. Merge preserves existing bindings by default; replacement/removal must be explicit. Read choices from production_get assets first. Reuse existing asset authoring tools for missing Characters/Locations/Artifacts/Looks. Artifacts enter through a completed Look attached to a matching Character shot; they are not a third native binding kind. No generation.",
      "requiredScopes": [
        "account:read",
        "production:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "sourceSnapshotRef": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "mode": {
            "type": "string",
            "enum": [
              "merge",
              "replace"
            ]
          },
          "choices": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "bindingId": {
                  "type": "string",
                  "pattern": "^manual:[a-zA-Z0-9-]{16,64}$"
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "character",
                    "location"
                  ]
                },
                "entityId": {
                  "type": "string",
                  "pattern": "^[a-fA-F0-9]{24}$"
                },
                "entityRevision": {
                  "type": "integer",
                  "minimum": 1
                },
                "contentRevision": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                },
                "referenceRevision": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                },
                "referenceSetId": {
                  "anyOf": [
                    {
                      "type": "null"
                    },
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    }
                  ]
                },
                "appearanceNotes": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "costume": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "expression": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "pose": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "temporaryCondition": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "lighting": {
                      "type": "string",
                      "maxLength": 1000
                    }
                  },
                  "required": []
                }
              },
              "required": [
                "kind",
                "entityId",
                "entityRevision",
                "contentRevision",
                "referenceRevision"
              ]
            },
            "minItems": 0,
            "maxItems": 40
          },
          "removeBindingIds": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "minItems": 0,
            "maxItems": 40
          }
        },
        "required": [
          "productionId",
          "operationId",
          "expectedVersion",
          "sourceSnapshotRef",
          "choices"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_cut_save",
      "title": "Assemble or edit the working cut",
      "description": "Prepare a working cut from existing usable native takes, or save edits against the exact parent revision. Trims use integer microseconds, preserving measured source duration separately. Keep/mute native audio; a retained continuous score supports gain/fades/loop. Native FFmpeg rendering is durable; poll the returned render. Earlier cuts/bytes stay intact. Completion means ready for final user review, not approved/final/canon.",
      "requiredScopes": [
        "account:read",
        "production:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "mode": {
            "type": "string",
            "enum": [
              "prepare",
              "edit"
            ]
          },
          "parentRevisionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "edits": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "outputPresetId": {
                "type": "string",
                "enum": [
                  "1080p24",
                  "1080p25",
                  "1080p30",
                  "720p24",
                  "720p30"
                ]
              },
              "shots": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "shotNodeId": {
                      "type": "string",
                      "pattern": "^[a-fA-F0-9]{24}$"
                    },
                    "included": {
                      "type": "boolean"
                    },
                    "sourceInUs": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 300000000
                    },
                    "sourceOutUs": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 300000000
                    },
                    "nativeAudio": {
                      "type": "string",
                      "enum": [
                        "keep",
                        "mute"
                      ]
                    },
                    "omissionReason": {
                      "type": "string",
                      "maxLength": 500
                    },
                    "framing": {
                      "type": "string",
                      "enum": [
                        "fit",
                        "fill"
                      ]
                    },
                    "cropAnchor": {
                      "type": "string",
                      "enum": [
                        "top",
                        "center",
                        "bottom"
                      ]
                    },
                    "audioGainDb": {
                      "type": "number",
                      "minimum": -30,
                      "maximum": 30
                    }
                  },
                  "required": [
                    "shotNodeId",
                    "included",
                    "sourceInUs",
                    "sourceOutUs",
                    "nativeAudio"
                  ]
                },
                "minItems": 1,
                "maxItems": 100
              },
              "music": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "assetId": {
                    "type": "string",
                    "pattern": "^[a-fA-F0-9]{24}$",
                    "description": "ID of an already saved and linked Media record returned by this workflow."
                  },
                  "sha256": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "sourceInUs": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "gainDb": {
                    "type": "number",
                    "minimum": -40,
                    "maximum": 6
                  },
                  "fadeInMs": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 10000
                  },
                  "fadeOutMs": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 10000
                  },
                  "loop": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "assetId",
                  "sha256",
                  "sourceInUs",
                  "gainDb",
                  "fadeInMs",
                  "fadeOutMs",
                  "loop"
                ]
              }
            },
            "required": [
              "outputPresetId",
              "shots"
            ]
          }
        },
        "required": [
          "productionId",
          "operationId",
          "expectedVersion",
          "mode"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_frames_generate",
      "title": "Generate the planned starting frames",
      "description": "Queue one native batch of 1–8 exact shot starting frames using the Production format, pinned identity/Location/Look and native reference-slot budget. For continuity, first generate and inspect an earlier anchor, then choose_draft_frame with its preview receipt before generating dependent shots. continuityReferences must identify that exact earlier selection in the same included location with no omitted cast or changed Look. Pricing/reservation/launch are internal. Prior candidates remain. The job reports omissions or blockers; no automatic paid retries.",
      "requiredScopes": [
        "account:read",
        "production:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "shotNodeIds": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-fA-F0-9]{24}$"
            },
            "minItems": 1,
            "maxItems": 8,
            "uniqueItems": true
          },
          "quality": {
            "type": "string",
            "enum": [
              "high",
              "medium",
              "low"
            ]
          },
          "continuityReferences": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "shotNodeId": {
                  "type": "string",
                  "pattern": "^[a-fA-F0-9]{24}$"
                },
                "sourceShotNodeId": {
                  "type": "string",
                  "pattern": "^[a-fA-F0-9]{24}$"
                },
                "sheetId": {
                  "type": "string",
                  "pattern": "^[a-fA-F0-9]{24}$"
                },
                "renderId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                },
                "assetId": {
                  "type": "string",
                  "pattern": "^[a-fA-F0-9]{24}$",
                  "description": "ID of an already saved and linked Media record returned by this workflow."
                }
              },
              "required": [
                "shotNodeId",
                "sourceShotNodeId",
                "sheetId",
                "renderId",
                "assetId"
              ]
            },
            "minItems": 0,
            "maxItems": 8
          }
        },
        "required": [
          "productionId",
          "operationId",
          "expectedVersion",
          "shotNodeIds"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_get",
      "title": "Read Production progress and the next step",
      "description": "Read one bounded part of the current Production: scene, pinned assets and eligible source choices, shot plan, storyboard frames, video takes, cut or history. Overview gives blockers, source versions, format, original jobs and next actions. It never substitutes latest source text for the pinned Scene. For asset choices, optional kind/search narrow the native catalog.",
      "requiredScopes": [
        "account:read",
        "production:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "section": {
            "type": "string",
            "enum": [
              "overview",
              "scene",
              "assets",
              "shots",
              "frames",
              "video",
              "cut",
              "history"
            ]
          },
          "search": {
            "type": "string",
            "maxLength": 120
          },
          "kind": {
            "type": "string",
            "enum": [
              "character",
              "location"
            ]
          },
          "cursor": {
            "type": "string",
            "maxLength": 3000
          }
        },
        "required": [
          "productionId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_job_get",
      "title": "Check the original Production operation",
      "description": "Read this client/account’s original operation, durable stage, native receipts, blockers and completed result. Returned progress is authoritative technical state, never creative approval. Reading cannot launch a provider request.",
      "requiredScopes": [
        "account:read",
        "production:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_job_recover",
      "title": "Recover retained Production results without resubmission",
      "description": "Reconcile only the original native receipt/job/render or retained bytes. Never requote, start a replacement, repeat an uncertain provider submission or spend on a remaining Director stage. Explicit continue_saved_update is the separate authorization for a proven-unstarted stage.",
      "requiredScopes": [
        "account:read",
        "production:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          }
        },
        "required": [
          "jobId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_media_preview",
      "title": "Inspect a Production frame or open its retained video",
      "description": "Inspect an actual managed Production image, or obtain the authenticated Studio viewer for an exact take/cut. Ownership, pinned usage and byte hashes are verified. Preview delivery is not proof of watching, listening or review. No public bucket access, raw base64 text or generation.",
      "requiredScopes": [
        "account:read",
        "production:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "kind": {
            "type": "string",
            "enum": [
              "frame",
              "take",
              "cut"
            ]
          },
          "shotNodeId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "sheetId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          },
          "renderId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          }
        },
        "required": [
          "productionId",
          "kind"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_review_save",
      "title": "Record an inspection, draft selection or cut finding",
      "description": "Record agent observations of the exact frame/take/output; distinguish inspected video, stills and heard sound. choose_draft_frame requires the exact current previewFingerprint and inspected stills, and selects a working frame for continuity/Video while creator review stays unchanged. choose_draft_take chooses retained completed footage for a working cut. Evidence never becomes verified human approval. Cut notes/checks and finding resolution are distinct; replacement does not resolve a finding. Final approval stays a Studio decision.",
      "requiredScopes": [
        "account:read",
        "production:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "target": {
            "type": "string",
            "enum": [
              "frame",
              "take",
              "cut"
            ]
          },
          "action": {
            "type": "string",
            "enum": [
              "observe",
              "choose_draft_frame",
              "choose_draft_take",
              "cut_action"
            ]
          },
          "evidence": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "picture": {
                "type": "string",
                "enum": [
                  "video_inspected",
                  "stills_only",
                  "not_inspected"
                ]
              },
              "sound": {
                "type": "string",
                "enum": [
                  "heard",
                  "not_inspected"
                ]
              },
              "observations": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "atSeconds": {
                "type": "number",
                "minimum": 0,
                "maximum": 3600
              },
              "reportedUserInstruction": {
                "type": "string",
                "maxLength": 2000
              }
            },
            "required": [
              "picture",
              "sound",
              "observations"
            ]
          },
          "previewFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Copy the exact receipt returned by previewing this image for the current brief. Do not fabricate it or reuse a stale preview."
          },
          "shotNodeId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "sheetId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "renderId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "Opaque original job ID returned by generation/admission. Poll or recover it instead of starting another job."
          },
          "expectedReviewRevision": {
            "type": "integer",
            "minimum": 0
          },
          "outputSha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "cutAction": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": {
                    "const": "cut-check",
                    "type": "string"
                  },
                  "index": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 99
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "pass",
                      "needs_work",
                      "not_checked"
                    ]
                  },
                  "dimensions": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "pose": {
                        "type": "string",
                        "enum": [
                          "pass",
                          "needs_work",
                          "not_checked"
                        ]
                      },
                      "layout": {
                        "type": "string",
                        "enum": [
                          "pass",
                          "needs_work",
                          "not_checked"
                        ]
                      },
                      "camera": {
                        "type": "string",
                        "enum": [
                          "pass",
                          "needs_work",
                          "not_checked"
                        ]
                      },
                      "identity": {
                        "type": "string",
                        "enum": [
                          "pass",
                          "needs_work",
                          "not_checked"
                        ]
                      },
                      "exposure": {
                        "type": "string",
                        "enum": [
                          "pass",
                          "needs_work",
                          "not_checked"
                        ]
                      },
                      "sound": {
                        "type": "string",
                        "enum": [
                          "pass",
                          "needs_work",
                          "not_checked"
                        ]
                      }
                    },
                    "required": []
                  },
                  "note": {
                    "type": "string",
                    "maxLength": 2000
                  }
                },
                "required": [
                  "type",
                  "index",
                  "status",
                  "dimensions",
                  "note"
                ]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": {
                    "const": "add-finding",
                    "type": "string"
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "continuity",
                      "picture",
                      "sound",
                      "timing",
                      "script"
                    ]
                  },
                  "shotNodeId": {
                    "type": "string",
                    "pattern": "^[a-fA-F0-9]{24}$"
                  },
                  "frame": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "expected": {
                    "type": "string",
                    "maxLength": 2000
                  },
                  "observed": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "blocking": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "type",
                  "category",
                  "expected",
                  "observed",
                  "blocking"
                ]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": {
                    "const": "resolve-finding",
                    "type": "string"
                  },
                  "findingId": {
                    "type": "string",
                    "pattern": "^[a-fA-F0-9]{24}$"
                  },
                  "resolution": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  }
                },
                "required": [
                  "type",
                  "findingId",
                  "resolution"
                ]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": {
                    "const": "upsert-cue",
                    "type": "string"
                  },
                  "cue": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "id": {
                        "type": "string",
                        "pattern": "^[a-fA-F0-9]{24}$"
                      },
                      "category": {
                        "type": "string",
                        "enum": [
                          "dialogue",
                          "sound",
                          "action",
                          "camera"
                        ]
                      },
                      "startFrame": {
                        "type": "integer",
                        "minimum": 0
                      },
                      "frameCount": {
                        "type": "integer",
                        "minimum": 1
                      },
                      "text": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 2000
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "proposed",
                          "confirmed"
                        ]
                      }
                    },
                    "required": [
                      "category",
                      "startFrame",
                      "frameCount",
                      "text",
                      "status"
                    ]
                  }
                },
                "required": [
                  "type",
                  "cue"
                ]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": {
                    "const": "delete-cue",
                    "type": "string"
                  },
                  "cueId": {
                    "type": "string",
                    "pattern": "^[a-fA-F0-9]{24}$"
                  }
                },
                "required": [
                  "type",
                  "cueId"
                ]
              }
            ]
          }
        },
        "required": [
          "productionId",
          "operationId",
          "expectedVersion",
          "target",
          "action",
          "evidence"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_scene_get",
      "title": "Read the source Scene before producing it",
      "description": "Read an accessible Scene, its actual screenplay blocks, document version and Storyworld. Reuse this exact version when starting a Production. Does not rewrite source or infer approval.",
      "requiredScopes": [
        "account:read",
        "production:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "sceneId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          }
        },
        "required": [
          "storyworldId",
          "sceneId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_scene_save",
      "title": "Start a Production from a Scene",
      "description": "Scene-first setup or explicit source update. When reusing a completed Character Look, choose its Storyworld for the Scene and Production and pin its exact Character version; current Look attachment requires that same Storyworld. Start requires Storyworld, title and an explicit format (ask 1:1 or 16:9 once unless supplied), plus either an inspected existing Scene/documentVersion or a new sceneTitle/script. Format stays fixed through frames, takes and export. Update requires productionId/expectedVersion/documentVersion; source edits invalidate downstream readiness without replacing saved media. Retry only the identical operationId.",
      "requiredScopes": [
        "account:read",
        "production:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "start",
              "update"
            ]
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "sceneId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "sceneTitle": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "script": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50000
          },
          "documentVersion": {
            "type": "integer",
            "minimum": 1
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "aspectRatio": {
            "type": "string",
            "enum": [
              "1:1",
              "16:9",
              "9:16"
            ]
          }
        },
        "required": [
          "mode",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_search",
      "title": "Find a Scene or Production",
      "description": "Find accessible saved Scenes or Productions before creating. Scenes belong to a Storyworld; inspect the exact saved Scene with production_scene_get. No generation or edits.",
      "requiredScopes": [
        "account:read",
        "production:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "productions",
              "scenes"
            ]
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "search": {
            "type": "string",
            "maxLength": 120
          },
          "cursor": {
            "type": "string",
            "maxLength": 3000
          }
        },
        "required": [
          "kind"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_shots_plan",
      "title": "Ask Director AI to plan this Scene",
      "description": "Queue the existing Director draft, independent review and refinement against the exact pinned Scene/assets. Server pricing and billing stay internal; no per-job quote prompt. Returns a durable original job immediately, not a finished plan. Poll production_job_get; never submit a replacement after interruption. continue_saved_update explicitly authorizes only native stages proven unstarted, under a new operation and current grant.",
      "requiredScopes": [
        "account:read",
        "production:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "mode": {
            "type": "string",
            "enum": [
              "new",
              "continue_saved_update"
            ]
          },
          "sourceSnapshotRef": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "sourceReceiptId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "targetDurationSeconds": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 3600
          },
          "creativeBrief": {
            "type": "string",
            "maxLength": 2000
          },
          "pacing": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "version": {
                "type": "integer",
                "const": 1
              },
              "mode": {
                "type": "string",
                "enum": [
                  "scene",
                  "target"
                ]
              }
            },
            "required": [
              "version",
              "mode"
            ]
          },
          "planningModel": {
            "type": "string",
            "enum": [
              "gpt-6-astra",
              "gpt-6.1-sol",
              "gpt-6.1-terra",
              "grok-4.7"
            ]
          },
          "refinementModel": {
            "type": "string",
            "enum": [
              "gpt-6-astra",
              "gpt-6.1-terra"
            ]
          }
        },
        "required": [
          "productionId",
          "operationId",
          "expectedVersion"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_shots_save",
      "title": "Save the Director plan or a scoped shot correction",
      "description": "Save a retained Director proposal or exact native draft, with current version/input fingerprint. Mark readiness as agent-reviewed, never creator-approved. Supply a correction reason and starting revision when updating. Earlier shot revisions, frames and takes remain retained; report affected downstream work before generating. completedLooks requires the Production and Look to share a Storyworld and the exact Character version. All shot targets and current use grants are checked before retention; native mutation-time checks remain. Attaches exact completed Look versions to matching Character shots while preserving original face references.",
      "requiredScopes": [
        "account:read",
        "production:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "proposalId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "draft": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "targetDurationSeconds": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 3600
              },
              "fps": {
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "numerator": {
                        "type": "integer",
                        "const": 24
                      },
                      "denominator": {
                        "type": "integer",
                        "const": 1
                      }
                    },
                    "required": [
                      "numerator",
                      "denominator"
                    ]
                  },
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "numerator": {
                        "type": "integer",
                        "const": 25
                      },
                      "denominator": {
                        "type": "integer",
                        "const": 1
                      }
                    },
                    "required": [
                      "numerator",
                      "denominator"
                    ]
                  },
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "numerator": {
                        "type": "integer",
                        "const": 30
                      },
                      "denominator": {
                        "type": "integer",
                        "const": 1
                      }
                    },
                    "required": [
                      "numerator",
                      "denominator"
                    ]
                  },
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "numerator": {
                        "type": "integer",
                        "const": 24000
                      },
                      "denominator": {
                        "type": "integer",
                        "const": 1001
                      }
                    },
                    "required": [
                      "numerator",
                      "denominator"
                    ]
                  },
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "numerator": {
                        "type": "integer",
                        "const": 30000
                      },
                      "denominator": {
                        "type": "integer",
                        "const": 1001
                      }
                    },
                    "required": [
                      "numerator",
                      "denominator"
                    ]
                  }
                ]
              },
              "pacing": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "version": {
                    "type": "integer",
                    "const": 1
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "scene",
                      "target"
                    ]
                  }
                },
                "required": [
                  "version",
                  "mode"
                ]
              },
              "creativeBrief": {
                "type": "string",
                "maxLength": 2000
              },
              "shots": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "key": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "nodeId": {
                      "type": "string",
                      "pattern": "^[a-fA-F0-9]{24}$"
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    "action": {
                      "type": "string",
                      "maxLength": 4000
                    },
                    "purpose": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "cutReason": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "minimumActionSeconds": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 300
                    },
                    "dialogueSeconds": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 300
                    },
                    "pauseSeconds": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 300
                    },
                    "timingRelationship": {
                      "type": "string",
                      "enum": [
                        "sequential",
                        "overlap"
                      ]
                    },
                    "continuity": {
                      "type": "object",
                      "maxProperties": 30,
                      "additionalProperties": true
                    },
                    "durationSeconds": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "maximum": 300
                    },
                    "sourceBlockIds": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "minItems": 1,
                      "maxItems": 500
                    },
                    "assetBindingIds": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 100
                      },
                      "minItems": 0,
                      "maxItems": 40
                    },
                    "shotSpec": {
                      "type": "object",
                      "maxProperties": 30,
                      "additionalProperties": true
                    },
                    "direction": {
                      "type": "object",
                      "maxProperties": 30,
                      "additionalProperties": true
                    },
                    "lookReferences": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "bindingId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 100
                          },
                          "lookId": {
                            "type": "string",
                            "pattern": "^[a-fA-F0-9]{24}$",
                            "description": "ID of the saved Character Look recipe, distinct from its generated image or selected version."
                          }
                        },
                        "required": [
                          "bindingId",
                          "lookId"
                        ]
                      },
                      "minItems": 0,
                      "maxItems": 8
                    }
                  },
                  "required": [
                    "key",
                    "title",
                    "action",
                    "durationSeconds",
                    "sourceBlockIds",
                    "assetBindingIds",
                    "shotSpec",
                    "purpose",
                    "cutReason",
                    "minimumActionSeconds",
                    "dialogueSeconds",
                    "pauseSeconds",
                    "timingRelationship"
                  ]
                },
                "minItems": 1,
                "maxItems": 100
              }
            },
            "required": [
              "targetDurationSeconds",
              "fps",
              "shots"
            ]
          },
          "inputFingerprint": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "review": {
            "type": "string",
            "enum": [
              "agent_ready",
              "draft"
            ]
          },
          "basedOnRevision": {
            "type": "integer",
            "minimum": 1
          },
          "correctionReason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "completedLooks": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "bindingId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                },
                "lookVersionId": {
                  "type": "string",
                  "pattern": "^[a-fA-F0-9]{24}$"
                },
                "shotNodeIds": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "pattern": "^[a-fA-F0-9]{24}$"
                  },
                  "minItems": 1,
                  "maxItems": 100
                },
                "shotKeys": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              },
              "required": [
                "bindingId",
                "lookVersionId"
              ]
            },
            "minItems": 0,
            "maxItems": 8
          },
          "reviewSource": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "renderId": {
                "type": "string",
                "pattern": "^[a-fA-F0-9]{24}$"
              },
              "reviewRevision": {
                "type": "integer",
                "minimum": 0
              },
              "findingIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                },
                "minItems": 0,
                "maxItems": 100
              }
            },
            "required": [
              "renderId",
              "reviewRevision",
              "findingIds"
            ]
          }
        },
        "required": [
          "productionId",
          "operationId",
          "expectedVersion"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_video_generate",
      "title": "Generate one take from the saved plan",
      "description": "Queue exactly one native Video take for a shot or prepared retake candidate. Internally retain the one quote and launch receipt before acknowledgement. Poll/recover this original job after a lost response; do not quote or generate again. Uses existing billing. Provider-native sound is not the saved ElevenLabs Character voice. A completed take is not selected, human-approved or final.",
      "requiredScopes": [
        "account:read",
        "production:generate"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "shotNodeId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "candidateId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          }
        },
        "required": [
          "productionId",
          "operationId",
          "expectedVersion",
          "shotNodeId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "production_video_plan_save",
      "title": "Set performance direction or prepare a targeted retake",
      "description": "Save the native Video plan, or prepare a retake candidate that preserves the original shot, selected frame, other direction and prior takes. A retake changes only its requested field/beat; it does not buy or select a video. Frame-composition issues belong in Storyboard, source action/dialogue in Shots/Scene, and trims in the cut. Generated duration covers the editorial duration and remains within the native 15-second limit.",
      "requiredScopes": [
        "account:read",
        "production:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "productionId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of the saved Production whose asset context must remain pinned."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "expectedVersion": {
            "type": "integer",
            "minimum": 1,
            "description": "Copy the current version from the latest workflow read. Refresh after a conflict; never increment or guess it."
          },
          "mode": {
            "type": "string",
            "enum": [
              "plan",
              "retake"
            ]
          },
          "shotNodeId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "correction": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "version": {
                "type": "integer",
                "const": 1
              },
              "field": {
                "type": "string",
                "enum": [
                  "motion",
                  "camera",
                  "sound"
                ]
              },
              "instruction": {
                "type": "string",
                "minLength": 1,
                "maxLength": 4000
              },
              "beatIndex": {
                "type": "integer",
                "minimum": 0,
                "maximum": 7
              },
              "sourceJobId": {
                "type": "string",
                "pattern": "^[a-fA-F0-9]{24}$"
              },
              "reviewNote": {
                "type": "string",
                "maxLength": 2000
              },
              "reviewRenderId": {
                "type": "string",
                "pattern": "^[a-fA-F0-9]{24}$"
              },
              "reviewJoinIndex": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000
              },
              "reviewFindingId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "version",
              "field",
              "instruction"
            ]
          },
          "resolution": {
            "type": "string",
            "enum": [
              "1080p",
              "720p"
            ]
          },
          "durationSeconds": {
            "type": "integer",
            "minimum": 1,
            "maximum": 15
          },
          "motion": {
            "type": "string",
            "maxLength": 16000
          },
          "camera": {
            "type": "string",
            "maxLength": 16000
          },
          "sound": {
            "type": "string",
            "maxLength": 16000
          },
          "continuity": {
            "type": "string",
            "maxLength": 16000
          },
          "endingShotNodeId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          }
        },
        "required": [
          "productionId",
          "operationId",
          "expectedVersion",
          "mode",
          "shotNodeId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          }
        },
        "required": [
          "schemaVersion"
        ],
        "additionalProperties": {}
      },
      "outputContract": "partial_versioned_envelope"
    },
    {
      "name": "reference_image_list",
      "title": "Find saved reference images",
      "description": "Find images already saved in Studio. Images without rights/provenance confirmation cannot be cast. Retain new original references with reference_image_upload and their source declaration first.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "query": {
            "type": "string",
            "maxLength": 200
          },
          "after": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": [
          "storyworldId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "nextAfter": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{24}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schemaVersion",
          "items",
          "nextAfter"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "reference_image_preview",
      "title": "View a saved reference image",
      "description": "View verified bytes of an authorized saved PNG, JPEG or WebP image. No caller URLs are fetched. Large originals return a resized display preview with separate original and preview hashes.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an already saved and linked Media record returned by this workflow."
          }
        },
        "required": [
          "storyworldId",
          "assetId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "reference": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "display": {
            "type": "object",
            "properties": {
              "originalSha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "previewSha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "resized": {
                "type": "boolean"
              }
            },
            "required": [
              "originalSha256",
              "previewSha256",
              "resized"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "schemaVersion",
          "reference",
          "display"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "reference_image_upload",
      "title": "Retain an incoming Studio reference",
      "description": "Upload an original PNG/JPEG/WebP up to 3 MiB and retain source, usage statement and verified byte hash. Use the local Codex upload helper so base64 stays out of model context. Source declarations are recorded as this MCP client acting for the connected account, never as a separate human review. No URL fetch or generation. Retry the same operationId and identical file/source.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "purpose": {
            "type": "string",
            "enum": [
              "character",
              "location",
              "artifact"
            ]
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "mimeType": {
            "type": "string",
            "enum": [
              "image/png",
              "image/jpeg",
              "image/webp"
            ]
          },
          "fileBase64": {
            "type": "string",
            "minLength": 4,
            "maxLength": 4194304,
            "description": "Programmatic upload bytes only. Use a host attachment adapter; never compose base64 in model text. Otherwise upload in Studio and reuse its saved asset ID."
          },
          "source": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "rightsBasis": {
                "type": "string",
                "enum": [
                  "creator_owned",
                  "licensed",
                  "consented",
                  "public_domain",
                  "other"
                ]
              },
              "rightsConfirmed": {
                "type": "boolean",
                "const": true,
                "description": "True only with a valid creator/rights declaration for the supplied source. Never invent consent."
              },
              "provider": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120
              },
              "modelId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "prompt": {
                "type": "string",
                "minLength": 1,
                "maxLength": 16000
              },
              "rightsStatement": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              }
            },
            "required": [
              "provider",
              "rightsStatement",
              "rightsBasis",
              "rightsConfirmed"
            ]
          }
        },
        "required": [
          "storyworldId",
          "title",
          "operationId",
          "mimeType",
          "fileBase64",
          "source"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "assetId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "mimeType": {
            "type": "string"
          },
          "sourceRecorded": {
            "type": "boolean",
            "const": true
          },
          "sourceRecordId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "sourceDeclarationSha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "sourceRecordLocation": {
            "type": "string",
            "const": "mcp_operation"
          },
          "assetProvenancePreserved": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "schemaVersion",
          "assetId",
          "storyworldId",
          "sha256",
          "mimeType",
          "sourceRecorded",
          "sourceRecordId",
          "sourceDeclarationSha256",
          "sourceRecordLocation",
          "assetProvenancePreserved"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "reference_image_upload_get",
      "title": "Recover the original reference upload",
      "description": "Read this client’s original upload intent and authoritative saved-Media receipt after a transfer or lost response. Requires the originating active connection and current Storyworld edit permission, using the uploader’s studio:write scope. Never generates, dispatches or creates a replacement. A completed receipt is authoritative; dispatching or needs_reconciliation means keep this operation and do not upload under a new ID.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          }
        },
        "required": [
          "storyworldId",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "intentId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "manifestHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "operationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "awaiting_bytes",
              "retryable",
              "dispatching",
              "needs_reconciliation",
              "completed"
            ]
          },
          "manifest": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          }
        },
        "required": [
          "schemaVersion",
          "intentId",
          "manifestHash",
          "storyworldId",
          "operationId",
          "status",
          "manifest"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "reference_image_upload_prepare",
      "title": "Prepare an attached reference image",
      "description": "Prepare one original host attachment without placing image bytes in chat. Inspect the host-provided local file with the reference-file helper, then pass its exact SHA-256, size, MIME and actual source declaration. Requires current Storyworld edit access. The short-lived upload-only ticket goes to the local helper as an Authorization header, never a URL. No generation. Reuse this exact operation ID and manifest after uncertainty; poll reference_image_upload_get before retrying. A reconnect cannot revive an older pending upload.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$",
            "description": "ID of an accessible saved Storyworld returned by discovery. Keep this destination fixed for the operation."
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          },
          "purpose": {
            "type": "string",
            "enum": [
              "character",
              "location",
              "artifact"
            ]
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "source": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "rightsBasis": {
                "type": "string",
                "enum": [
                  "creator_owned",
                  "licensed",
                  "consented",
                  "public_domain",
                  "other"
                ]
              },
              "rightsConfirmed": {
                "type": "boolean",
                "const": true,
                "description": "True only with a valid creator/rights declaration for the supplied source. Never invent consent."
              },
              "provider": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120
              },
              "modelId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "prompt": {
                "type": "string",
                "minLength": 1,
                "maxLength": 16000
              },
              "rightsStatement": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              }
            },
            "required": [
              "provider",
              "rightsStatement",
              "rightsBasis",
              "rightsConfirmed"
            ]
          },
          "mimeType": {
            "type": "string",
            "enum": [
              "image/png",
              "image/jpeg",
              "image/webp"
            ]
          },
          "byteLength": {
            "type": "integer",
            "minimum": 1,
            "maximum": 3145728
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "storyworldId",
          "operationId",
          "purpose",
          "title",
          "source",
          "mimeType",
          "byteLength",
          "sha256"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "intentId": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "manifestHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "operationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "awaiting_bytes",
              "retryable",
              "dispatching",
              "needs_reconciliation",
              "completed"
            ]
          },
          "manifest": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "upload": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string"
              },
              "method": {
                "type": "string",
                "const": "PUT"
              },
              "ticket": {
                "type": "string"
              },
              "expiresAt": {
                "type": "string"
              },
              "header": {
                "type": "string",
                "const": "Authorization"
              },
              "sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "byteLength": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "mimeType": {
                "type": "string"
              }
            },
            "required": [
              "url",
              "method",
              "ticket",
              "expiresAt",
              "header",
              "sha256",
              "byteLength",
              "mimeType"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "schemaVersion",
          "intentId",
          "manifestHash",
          "storyworldId",
          "operationId",
          "status",
          "manifest"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "storyworld_create",
      "title": "Create a Storyworld",
      "description": "Create a new Storyworld owned by the connected account. Search first. Retry the identical operationId after a lost response; this does not generate media or spend credits.",
      "requiredScopes": [
        "account:read",
        "studio:write"
      ],
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "operationId": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{16,64}$",
            "description": "Persist a client-generated UUID before this mutation. Repeat identical inputs and this same ID after interruption; a new ID is a new request."
          }
        },
        "required": [
          "title",
          "operationId"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworldId": {
            "type": "string",
            "pattern": "^[a-f0-9]{24}$"
          },
          "created": {
            "type": "boolean"
          }
        },
        "required": [
          "schemaVersion",
          "storyworldId",
          "created"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    },
    {
      "name": "storyworld_list",
      "title": "Find your Storyworlds",
      "description": "List Storyworlds where your current membership allows reading. Select a Storyworld before casting.",
      "requiredScopes": [
        "account:read",
        "studio:read"
      ],
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 200
          },
          "after": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{24}$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": []
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1"
          },
          "storyworlds": {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "nextAfter": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-f0-9]{24}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schemaVersion",
          "storyworlds",
          "nextAfter"
        ],
        "additionalProperties": {}
      },
      "outputContract": "declared_schema"
    }
  ]
}
