# clip_create_portrait_sibling

Canonical HTML page: https://bitterclip.com/docs/assistants/tools/clip_create_portrait_sibling

Surface: default model and app

Product release: 1dce717408a55fac1047e7d779177fa3ef8ede51
Public contract commit: 1ce47f7857ae3d9b6933fe83d5c33de3ae5efc64
Public contract SHA-256: 241d47d25e4b4c1dae9d2263793874d06fc4ba7bc3c78d4cf2bc63fbb32ed7dc
Descriptor SHA-256: 885d46f3ca3939dec2ace0cd6e93611c8b3f741f2d8f7a82e0adfe1452cc9a9e
Captured: 2026-09-24T16:39:30.100Z
Source: https://app.bitterclip.com/api/v1/mcp_descriptors.json

Create a separate 9:16 portrait sibling from one current rendered 16:9 landscape Clip. Read the landscape Clip first and pass its exact revision, draft_revision, and program_digest. BitterClip copies only its source-backed editorial timing, captions, audio policy, transitions, and safely mappable music; the child starts as a draft with independently editable centered framing and no Render, Export, package, credit, or publication. It does not invent speaker geometry or silently carry landscape crop decisions: apply source-time geometry through episode_edit occurrence.reframe before render_create. A 9:16 canvas over 16:9 footage keeps only a vertical slice of each frame; episode_framing_guidance reports, per visible person, whether their measured extent fits that crop window (fits | too_wide | uncertain | unknown). Local camera choices, overlays, identity/baked material, malformed music anchors, stale source state, or a non-landscape/unrendered source fail before a child exists. Retrying the identical idempotency key returns the same sibling.

The JSON blocks below are the exact MCP descriptor projections served by Rails for the named profiles at capture time. Security schemes and resource URIs may vary by connected host.

## Default model descriptor

```json
{
  "name": "clip_create_portrait_sibling",
  "title": "Create a portrait sibling clip",
  "description": "Create a separate 9:16 portrait sibling from one current rendered 16:9 landscape Clip. Read the landscape Clip first and pass its exact revision, draft_revision, and program_digest. BitterClip copies only its source-backed editorial timing, captions, audio policy, transitions, and safely mappable music; the child starts as a draft with independently editable centered framing and no Render, Export, package, credit, or publication. It does not invent speaker geometry or silently carry landscape crop decisions: apply source-time geometry through episode_edit occurrence.reframe before render_create. A 9:16 canvas over 16:9 footage keeps only a vertical slice of each frame; episode_framing_guidance reports, per visible person, whether their measured extent fits that crop window (fits | too_wide | uncertain | unknown). Local camera choices, overlays, identity/baked material, malformed music anchors, stale source state, or a non-landscape/unrendered source fail before a child exists. Retrying the identical idempotency key returns the same sibling.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "source_clip_id": {
        "type": "string",
        "description": "Current derived landscape Clip public ID (comp_...). Read it first; a top-level Episode or legacy Clip row is refused."
      },
      "expected_source_revision": {
        "type": "integer",
        "description": "Current integer revision from episode_read for source_clip_id."
      },
      "expected_source_draft_revision": {
        "type": "string",
        "description": "Current opaque draft_revision from episode_read for source_clip_id."
      },
      "expected_source_program_digest": {
        "type": "string",
        "description": "Current SHA-256 program_digest from episode_read for source_clip_id."
      },
      "title": {
        "type": "string",
        "description": "Optional title for the portrait sibling. Omit to derive one from the landscape Clip."
      },
      "idempotency_key": {
        "type": "string",
        "description": "Caller-stable key for an exact safe retry."
      }
    },
    "required": [
      "source_clip_id",
      "expected_source_revision",
      "expected_source_draft_revision",
      "expected_source_program_digest",
      "idempotency_key"
    ],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ],
    "ui": {
      "visibility": [
        "model",
        "app"
      ]
    },
    "openai/widgetAccessible": true
  }
}
```

## App descriptor

```json
{
  "name": "clip_create_portrait_sibling",
  "title": "Create a portrait sibling clip",
  "description": "Create a separate 9:16 portrait sibling from one current rendered 16:9 landscape Clip. Read the landscape Clip first and pass its exact revision, draft_revision, and program_digest. BitterClip copies only its source-backed editorial timing, captions, audio policy, transitions, and safely mappable music; the child starts as a draft with independently editable centered framing and no Render, Export, package, credit, or publication. It does not invent speaker geometry or silently carry landscape crop decisions: apply source-time geometry through episode_edit occurrence.reframe before render_create. A 9:16 canvas over 16:9 footage keeps only a vertical slice of each frame; episode_framing_guidance reports, per visible person, whether their measured extent fits that crop window (fits | too_wide | uncertain | unknown). Local camera choices, overlays, identity/baked material, malformed music anchors, stale source state, or a non-landscape/unrendered source fail before a child exists. Retrying the identical idempotency key returns the same sibling.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "source_clip_id": {
        "type": "string",
        "description": "Current derived landscape Clip public ID (comp_...). Read it first; a top-level Episode or legacy Clip row is refused."
      },
      "expected_source_revision": {
        "type": "integer",
        "description": "Current integer revision from episode_read for source_clip_id."
      },
      "expected_source_draft_revision": {
        "type": "string",
        "description": "Current opaque draft_revision from episode_read for source_clip_id."
      },
      "expected_source_program_digest": {
        "type": "string",
        "description": "Current SHA-256 program_digest from episode_read for source_clip_id."
      },
      "title": {
        "type": "string",
        "description": "Optional title for the portrait sibling. Omit to derive one from the landscape Clip."
      },
      "idempotency_key": {
        "type": "string",
        "description": "Caller-stable key for an exact safe retry."
      }
    },
    "required": [
      "source_clip_id",
      "expected_source_revision",
      "expected_source_draft_revision",
      "expected_source_program_digest",
      "idempotency_key"
    ],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ],
    "ui": {
      "visibility": [
        "model",
        "app"
      ]
    },
    "openai/widgetAccessible": true
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "clip_id": {
        "type": "string",
        "description": "New independently editable portrait Clip (comp_...)."
      },
      "parent_episode_id": {
        "type": [
          "string",
          "null"
        ],
        "description": "Shared top-level Episode lineage, when present."
      },
      "source_clip_id": {
        "type": "string"
      },
      "source_revision": {
        "type": "integer"
      },
      "source_draft_revision": {
        "type": "string"
      },
      "source_program_digest": {
        "type": "string"
      },
      "revision": {
        "type": "integer"
      },
      "draft_revision": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "status": {
        "type": "string",
        "enum": [
          "draft"
        ]
      },
      "aspect_ratio": {
        "type": "string",
        "enum": [
          "9:16"
        ]
      },
      "canvas": {
        "type": "string",
        "enum": [
          "1080x1920@30"
        ]
      },
      "duration_seconds": {
        "type": "number"
      },
      "occurrence_map": {
        "type": "array",
        "items": {
          "type": "object"
        },
        "description": "Landscape Clip occurrence to portrait Clip occurrence mapping; composition decisions remain child-local."
      },
      "framing": {
        "type": "object",
        "description": "Truthful initial framing state and the next geometry-aware action."
      },
      "render_status": {
        "type": "string",
        "enum": [
          "not_requested"
        ]
      },
      "receipt_id": {
        "type": [
          "string",
          "null"
        ]
      },
      "already_applied": {
        "type": "boolean"
      },
      "next_action": {
        "type": "object"
      },
      "render_next_action": {
        "type": "object"
      },
      "blockers": {
        "type": "array",
        "items": {
          "type": "object"
        }
      }
    },
    "required": [],
    "additionalProperties": false
  }
}
```

## Live Workspace descriptor

```json
{
  "name": "clip_create_portrait_sibling",
  "title": "Create a portrait sibling clip",
  "description": "Create a separate 9:16 portrait sibling from one current rendered 16:9 landscape Clip. Read the landscape Clip first and pass its exact revision, draft_revision, and program_digest. BitterClip copies only its source-backed editorial timing, captions, audio policy, transitions, and safely mappable music; the child starts as a draft with independently editable centered framing and no Render, Export, package, credit, or publication. It does not invent speaker geometry or silently carry landscape crop decisions: apply source-time geometry through episode_edit occurrence.reframe before render_create. A 9:16 canvas over 16:9 footage keeps only a vertical slice of each frame; episode_framing_guidance reports, per visible person, whether their measured extent fits that crop window (fits | too_wide | uncertain | unknown). Local camera choices, overlays, identity/baked material, malformed music anchors, stale source state, or a non-landscape/unrendered source fail before a child exists. Retrying the identical idempotency key returns the same sibling.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "source_clip_id": {
        "type": "string",
        "description": "Current derived landscape Clip public ID (comp_...). Read it first; a top-level Episode or legacy Clip row is refused."
      },
      "expected_source_revision": {
        "type": "integer",
        "description": "Current integer revision from episode_read for source_clip_id."
      },
      "expected_source_draft_revision": {
        "type": "string",
        "description": "Current opaque draft_revision from episode_read for source_clip_id."
      },
      "expected_source_program_digest": {
        "type": "string",
        "description": "Current SHA-256 program_digest from episode_read for source_clip_id."
      },
      "title": {
        "type": "string",
        "description": "Optional title for the portrait sibling. Omit to derive one from the landscape Clip."
      },
      "idempotency_key": {
        "type": "string",
        "description": "Caller-stable key for an exact safe retry."
      }
    },
    "required": [
      "source_clip_id",
      "expected_source_revision",
      "expected_source_draft_revision",
      "expected_source_program_digest",
      "idempotency_key"
    ],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "clip_id": {
        "type": "string",
        "description": "New independently editable portrait Clip (comp_...)."
      },
      "parent_episode_id": {
        "type": [
          "string",
          "null"
        ],
        "description": "Shared top-level Episode lineage, when present."
      },
      "source_clip_id": {
        "type": "string"
      },
      "source_revision": {
        "type": "integer"
      },
      "source_draft_revision": {
        "type": "string"
      },
      "source_program_digest": {
        "type": "string"
      },
      "revision": {
        "type": "integer"
      },
      "draft_revision": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "status": {
        "type": "string",
        "enum": [
          "draft"
        ]
      },
      "aspect_ratio": {
        "type": "string",
        "enum": [
          "9:16"
        ]
      },
      "canvas": {
        "type": "string",
        "enum": [
          "1080x1920@30"
        ]
      },
      "duration_seconds": {
        "type": "number"
      },
      "occurrence_map": {
        "type": "array",
        "items": {
          "type": "object"
        },
        "description": "Landscape Clip occurrence to portrait Clip occurrence mapping; composition decisions remain child-local."
      },
      "framing": {
        "type": "object",
        "description": "Truthful initial framing state and the next geometry-aware action."
      },
      "render_status": {
        "type": "string",
        "enum": [
          "not_requested"
        ]
      },
      "receipt_id": {
        "type": [
          "string",
          "null"
        ]
      },
      "already_applied": {
        "type": "boolean"
      },
      "next_action": {
        "type": "object"
      },
      "render_next_action": {
        "type": "object"
      },
      "blockers": {
        "type": "array",
        "items": {
          "type": "object"
        }
      },
      "workspace_binding": {
        "type": "object",
        "properties": {
          "schema": {
            "type": "string",
            "enum": [
              "bitterclip.workspace-binding.v2"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "live_workspace"
            ]
          },
          "project_id": {
            "type": "string"
          },
          "target_kind": {
            "type": "string",
            "enum": [
              "episode",
              "clip"
            ]
          },
          "target_id": {
            "type": "string"
          },
          "revision": {
            "type": "integer"
          },
          "draft_revision": {
            "type": "string"
          },
          "workspace_url": {
            "type": "string"
          },
          "output_id": {
            "type": "string"
          },
          "output_status": {
            "type": "string",
            "enum": [
              "missing",
              "stale",
              "rendering",
              "ready",
              "failed"
            ]
          },
          "output_revision": {
            "type": "integer"
          },
          "parent_episode_id": {
            "type": "string"
          }
        },
        "required": [
          "schema",
          "mode",
          "target_kind",
          "target_id",
          "revision",
          "draft_revision",
          "workspace_url",
          "output_status"
        ],
        "additionalProperties": false
      }
    },
    "required": [],
    "additionalProperties": false
  }
}
```

## Errors

```json
[
  "composition_not_found",
  "stale_composition_revision",
  "idempotency_conflict",
  "invalid_input",
  "portrait_sibling_source_not_clip",
  "portrait_sibling_source_not_landscape",
  "portrait_sibling_source_empty",
  "portrait_sibling_source_not_currently_rendered",
  "portrait_sibling_source_invalid_lineage",
  "portrait_sibling_overlays_unsupported",
  "portrait_sibling_local_camera_program_unsupported",
  "portrait_sibling_identity_unsupported",
  "portrait_sibling_baked_material_unsupported",
  "portrait_sibling_music_unsupported",
  "music_asset_missing",
  "music_asset_mismatch",
  "music_anchor_unavailable",
  "music_range_inverted",
  "music_ranges_overlap",
  "music_asset_too_short",
  "music_trim_out_of_range",
  "music_fades_too_long",
  "music_presentation_map_unsupported",
  "angle_interval_exceeds_recording"
]
```

## Examples

```json
[]
```
