episode_status
Check an episode's render status (and get the file)
Poll the render status of an episode (composition) after episode_render — the episode-vocabulary materialize poll, so you never switch to the compositions_* tools. Returns the render lifecycle state (status: draft | queued | rendering | ready | failed), the media sub-status (ready | stale | missing), and progress. A ready render includes exact rendered dialogue-seam preflight evidence in both the result and model-facing summary: inspect every flagged timestamp before accepting the edit; no markers means only that deterministic checks were clear, never that listening or taste passed. When a simultaneous Picture Program was rendered, picture_program_render_receipt is authoritative evidence of the layouts and maximum simultaneous picture count in this exact MP4; it does not certify framing taste. When media is ready, download_url is the exact private/current Download action; pair it with editor Open. playback_url is embedded-app media plumbing and is never user-facing delivery. The bounded wait itself is read-only and incurs no render charge. Status may refresh verified render-dependency cache stamps, but creates no Compositions or exact Exports. Imported playback can be ready while the Composition is draft, with no render-plan hash, exact Export, or render evidence. After episode_render returns "queued", call episode_status with the same episode_id until status is "ready".
Surface: App-only
Product release 1dce717408a55fac1047e7d779177fa3ef8ede51
Public contract commit 1ce47f7857ae3d9b6933fe83d5c33de3ae5efc64
Public contract SHA-256 241d47d25e4b4c1dae9d2263793874d06fc4ba7bc3c78d4cf2bc63fbb32ed7dc
Captured 2026-09-24T16:39:30.100Z. Review or improve this contract on GitHub.
These blocks show the complete MCP descriptors captured from serving Rails. Security schemes and resource URIs can differ by connected host.
App descriptor
{
"name": "episode_status",
"title": "Check an episode's render status (and get the file)",
"description": "Poll the render status of an episode (composition) after episode_render — the episode-vocabulary materialize poll, so you never switch to the compositions_* tools. Returns the render lifecycle state (status: draft | queued | rendering | ready | failed), the media sub-status (ready | stale | missing), and progress. A ready render includes exact rendered dialogue-seam preflight evidence in both the result and model-facing summary: inspect every flagged timestamp before accepting the edit; no markers means only that deterministic checks were clear, never that listening or taste passed. When a simultaneous Picture Program was rendered, picture_program_render_receipt is authoritative evidence of the layouts and maximum simultaneous picture count in this exact MP4; it does not certify framing taste. When media is ready, download_url is the exact private/current Download action; pair it with editor Open. playback_url is embedded-app media plumbing and is never user-facing delivery. The bounded wait itself is read-only and incurs no render charge. Status may refresh verified render-dependency cache stamps, but creates no Compositions or exact Exports. Imported playback can be ready while the Composition is draft, with no render-plan hash, exact Export, or render evidence. After episode_render returns \"queued\", call episode_status with the same episode_id until status is \"ready\".",
"inputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string",
"description": "The episode (composition) public ID, such as comp_..., to check."
},
"wait_for_seconds": {
"type": "integer",
"minimum": 0,
"maximum": 20
},
"expected_revision": {
"type": "integer",
"minimum": 0
},
"expected_render_plan_hash": {
"type": "string",
"pattern": "^[0-9a-f]{64}$"
}
},
"required": [
"episode_id"
],
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
],
"ui": {
"visibility": [
"app"
]
},
"openai/widgetAccessible": true,
"openai/visibility": "private"
},
"outputSchema": {
"type": "object",
"properties": {
"render_id": {
"type": [
"string",
"null"
],
"description": "Current Render artifact public ID when one exists."
},
"episode_id": {
"type": "string"
},
"title": {
"type": "string"
},
"revision": {
"type": "integer",
"minimum": 0,
"description": "Current structural revision of the Episode."
},
"render_plan_hash": {
"type": [
"string",
"null"
],
"pattern": "^[0-9a-f]{64}$",
"description": "Exact current render-plan fingerprint."
},
"status": {
"type": "string",
"description": "Render lifecycle state: draft | queued | rendering | ready | failed."
},
"progress": {
"type": "number",
"description": "0.0–1.0 render progress."
},
"render_phase": {
"type": "string",
"description": "Current render phase when the renderer reports one."
},
"span_summary": {
"type": "object",
"description": "Compact authored-span readiness summary for this Episode."
},
"media": {
"type": "object",
"description": "The §7 media sub-status.",
"properties": {
"state": {
"type": "string",
"description": "ready (current playable media, including imported playback) | stale (the Composition changed) | missing (no settled playback)."
},
"render_plan_hash": {
"type": [
"string",
"null"
],
"pattern": "^[0-9a-f]{64}$",
"description": "Current Episode picture fingerprint; null for imported playback."
},
"playback_origin": {
"type": "string",
"enum": [
"imported"
],
"description": "Present when playback was adopted from a verified file without claiming a completed render."
},
"rendered_revision": {
"type": "string",
"description": "Compatibility revision token for the current media."
},
"rendered_structural_revision": {
"type": "integer",
"description": "Exact Episode structural revision encoded into the current media."
},
"rendered_render_plan_hash": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Picture fingerprint encoded into the current media."
}
}
},
"playback_url": {
"type": [
"string",
"null"
],
"description": "Embedded-app-only inline media for the current Render. Never expose it as user-facing review or delivery; use private/current download_url plus editor Open."
},
"poster_url": {
"type": [
"string",
"null"
],
"description": "Embedded-app-only exact current Render poster. Never expose or retain it in model prose."
},
"render_generation": {
"type": [
"string",
"null"
],
"description": "Opaque immutable identity for the exact ready MP4/poster generation."
},
"exact_export_id": {
"type": [
"string",
"null"
],
"pattern": "^rxpt_[a-z0-9]+$",
"description": "Immutable retained Export identity for an Episode or Clip."
},
"export_id": {
"type": [
"string",
"null"
],
"pattern": "^rxpt_[a-z0-9]+$",
"description": "Immutable retained exact Export matching this completed render; null for imported playback without render evidence. Its absence does not prevent basic playback."
},
"download_available": {
"type": "boolean"
},
"download_url": {
"type": [
"string",
"null"
],
"description": "A time-limited download URL to the rendered MP4 — present only when media.state is ready."
},
"expires_at": {
"type": [
"string",
"null"
],
"description": "ISO8601 expiry of download_url (present with download_url)."
},
"poll": {
"type": "object",
"description": "Polling instruction present while the Render is queued or rendering."
},
"next_action": {
"type": "object",
"description": "What to do next (poll_until_ready / download / failed)."
},
"blockers": {
"type": "array",
"items": {
"type": "object"
},
"description": "Typed blockers and their recovery actions."
},
"dialogue_seam_review": {
"type": "object",
"description": "Exact-render, measurement-only evidence for ordinary dialogue Junctions, including treated Crossfade regions. Markers prioritize bounded review; they are not a quality score or automatic rejection."
},
"picture_program_render_receipt": {
"type": "object",
"description": "Bounded authoritative receipt for a simultaneous Picture Program materialized in this exact current MP4: layout keys, scene count, maximum simultaneous pictures, and Program-audio authority. Present only when the renderer used a Picture Program; not a framing-quality score."
},
"error": {
"type": [
"object",
"null"
],
"description": "Public current render-failure reason when status is failed."
},
"render_error": {
"type": [
"object",
"null"
],
"description": "Last public render failure, retained while a retry is in flight."
},
"last_error": {
"type": [
"object",
"null"
],
"description": "Compatibility-explicit alias of render_error."
},
"render_error_history": {
"type": "array",
"items": {
"type": "object"
},
"description": "At most the three most recent public render failures."
},
"render_request_id": {
"type": [
"string",
"null"
],
"pattern": "^rrq_[a-z0-9]+$",
"description": "Exact admitted customer render request when known. Retain it with the result for recovery after navigation or a newer revision."
},
"render_attempt": {
"type": [
"integer",
"null"
]
},
"render_attempt_started_at": {
"type": [
"string",
"null"
]
}
},
"required": [],
"additionalProperties": false
}
}Errors
[
"composition_not_found",
"stale_composition_revision",
"invalid_input"
]Examples
[
{
"label": "Poll an episode render until it is ready",
"input": {
"episode_id": "comp_..."
}
}
]