---
name: animate-props
description: Keep an unusual prop's shape in video — draw it on the character with GPT Image 2.5, build a start frame in the location, then animate from that frame on H3 Max Turbo with the action in three steps; never describe, count or forbid the prop in the video prompt.
---
# A prop that holds its shape

FlashBoards user skill, version 1.2.3 (2026-10-13).

On the board, read these guides with `list_skills` and `get_skill` when the assistant exposes them; otherwise use the hosted index through an available read-only retrieval tool. Use that runtime’s actual model discovery, current page context and guarded board actions for execution. Keep native readiness, approval and cost gates; do not claim a guide was read when retrieval is unavailable.

Read related guides with `get_skill({skillId:"<id>"})` or the [hosted index](https://pub-78da82d51ed14147ac554d38094b0c0b.r2.dev/user-skills/1.2.3/index.html). Reading a guide does not start or authorize a paid generation.

Read `animate` for the shared rules. A video model has seen a million ordinary objects and pulls an unusual {prop} back to the usual one. Tested prop: one frame with **three** round lenses in a row.

> **Entry level:** 480P; 768P is for the final. **Quality route:** Seedance 2.5 (`seedance-2-5`) does this job much better; quote both.

## The recipe that holds

1. **The prop on the character** — `generate_image` with GPT Image 2.5 edit (`gpt-image-25-sunburst` or `-flare`), `quality: "medium"`, `width: 1536, height: 1024`; picture 1 = the person's {character sheet}, picture 2 = the product shot of the {prop}. Here the prop is described in words (an image model, not the video model); the person is not:
   ```
   Picture 1 is {character}. Picture 2 is {a prop}. Photograph {character} from picture 1 {wearing / holding} exactly the {prop} from picture 2 — the same {unusual feature, its count in CAPITALS, e.g. THREE round lenses in one row}, the same {material}, the same {colour}, the same {other details}. Front view, head and shoulders, looking into the lens, soft even light, plain dark grey background. Face, hair and clothes exactly as in picture 1.
   ```
2. **The start frame** — `generate_image`, `quality: "medium"`, `width: 1920, height: 1088`; picture 1 = the {location}, picture 2 = the still from step 1; frame it so the prop is big enough to read:
   ```
   Picture 1 is a location: {location in a few words}. Picture 2 is {character} {wearing / holding} {the prop in a few words}. Photograph {character} from picture 2 {standing} in the {location} of picture 1, a medium shot from the waist up, facing the camera in the middle of the frame, the {location} stretching behind, the same {surfaces, details} and {light} as in picture 1. {character} {wears / holds} exactly the {prop} of picture 2 — the same {unusual feature}, the same {material and colour} — and exactly the face, hair and clothes from picture 2. Cinematic film still, 16:9.
   ```
3. **The video** — `generate_video` with `minimax-h3-max-turbo`, `firstFrameUrl: <start frame>`, `duration: 7`, `resolution: "480P"` (768P for the final), `promptExpansion: "disabled"`. The action in three steps; nothing says "always"; the prop is never counted or forbidden:
   ```
   Live-action film shot, one continuous shot: {character} stands in {location}, medium shot from the waist up, facing the camera. The video begins exactly on the given first frame and is alive from it. The camera slowly pushes in. {background motion}; {light}.
   The {prop} stays exactly as in the first frame while {character} {wears / holds} it: the same {unusual feature}, the same {material and colour}.
   BEGINNING: {character} stands still {wearing / holding} the {prop}, looking into the lens.
   THEN: {the action with the prop}.
   END: {where the prop is until the last frame}; {what is bare / free}, and {character} looks straight into the lens.
   Exactly one person is in the frame: {character}. No dialogue, no speech. Sound: {sound}.
   ```
4. **Check**: `extract_video_frame` at the start, the middle and the end, and `describe_media` with a question ("How many lenses do the glasses have?").

## What broke (H3 Max Reference to Video, the same three images)

| Tried | Result |
|---|---|
| Only the product shot: "Image 3 is her glasses." | two lenses — normalised to ordinary glasses |
| "Count them: three lenses, always." | three lenses — and they never leave the face |
| Where it sits: "the third lens … sticking out on the RIGHT side" | a fourth lens floats in the air |
| Forbid the mistake: "no fourth lens, nothing floating" | back to two lenses — a negation names what you do not want |
| The prop-on-character still as a reference | in a wide shot the prop is a few pixels across and reads as ordinary — a reference helps less than a first frame |

An ordinary prop is fine as Image 3 in `animate-multi-image`.

## Execute through MCP or on the board

Use the person's FlashBoards account; never ask for a personal provider key or run the source's local scripts. Discover `get_account`, `list_generation_models` and the tools of this client first: a published guide does not prove a feature is deployed.

**Headless, no open board.** Quote with `estimate_generation_cost` (skill models: `estimate_skill_model`), then run `generate_image`, `generate_video`, `generate_audio` or `run_skill_model` with one stable `generationAttemptId` per logical attempt. Pass `maxCostUsd` only when the current operation and selected model support it; otherwise use the quoted cost and the person's explicit approval with the supported controls. Never silently ignore an unsupported spending cap; make one `get_generation` check after `retryAfterSeconds`. Pass the person's own results by `generationId`: images in `referenceGenerationIds`, `firstFrameUrl` and `endFrameUrl`, audio in `referenceAudioUrls` or `targetAudioUrl`, videos in `referenceVideoGenerationIds`. They are read on the server; signed result links do not work as public URLs. Every `generationId` a tool returns stays valid: a later read of the same result gives a different string, and both work. Film frames and gallery pictures go in by `previewHandle`: `referencePreviewHandles` of the generation tools, a `{previewHandle}` source of `arrange_images`, `crop_image` and `pad_image`, and `describe_media`. New files come from `show_media_upload_picker` as receipts. The person's character comes in as its sheet, by `generationId` or as an upload; there is no search by name. If the person names a character without the sheet, ask for it or make one with `character-sheet`; do not scan recent results for it. Free server steps: `trim_video`, `concat_videos`, `conform_video`, `replace_video_audio`, `extract_video_frame`, `extract_video_audio`, `detect_video_cuts`, `crop_image`, `pad_image`, `arrange_images`, `cut_audio_span`, `concat_audio_tracks`, `mix_audio_tracks`, `fit_audio_duration`, `add_audio_reverb`. Check every result with `describe_media` (a question about an image; `model`, `mode` and `sourceRange` only for a video) and `transcribe_media` for speech. Both checks are paid: `describe_media` costs a fraction of a cent for an image and about 2–4 ¢ for a short video (more for a long one), `transcribe_media` under 1 ¢ a minute — count the checks you plan in the price you name before the first paid step. `describe_media` is not reliable about sound: it misses effects mixed under music and can hear voices or instruments that are not there. Check speech with `transcribe_media` and ask the person to listen for effects and music. Never repay an uncertain submission; reuse an attempt ID only for the identical request. Make each new `requestId` or `generationAttemptId` unique, for example the task, the date and a short random suffix: an ID used before, even in another chat, replays that earlier request or answers `REQUEST_ID_CONFLICT`.

**On the board.** Inspect with `list_board_sessions` and `get_board_snapshot` and carry the same `sessionId` and a fresh `activeBoardId` as `expectedBoardId`. Native cards: `execute_board_action` (`listNativeModels`, `setModel`), `prepare_board_generation` with ordered board items or owned outputs, then one `generate_on_board` within the authorized budget. Board media tools: `list_media_tools` → `start_media_tool` → `get_media_tool_run`. Put headless results on a board with `add_media_to_board`.

Keep mandatory safety settings and the live limits of each model. Prices, timings, endpoints and "free retry" claims in the sources are historical, not FlashBoards contracts. If a step this guide needs is not available or is refused (a tool error, `audio_not_configured`, a missing model or input), keep the finished assets, tell the person which step is blocked and why, and ask how to go on. A single generation that ends `failed` is not a blocked step: submit it once more with a new `generationAttemptId` (reworded if it may have hit the content checker), and stop to ask only if it fails again. A failed attempt is not always refunded, so the retry may be paid again and `maxCostUsd` caps each request on its own: count both against the budget the person approved. Never swap in another route on your own: no image model redrawing a layout or a frame, no `describe_media` in place of the frames it should check, no clip generated only to take its sound, no picture drawn where the guide takes a film frame.

## Source and related guides

- [Original Learn guide](https://flashboards-h01.vercel.app/learn/acting/animate-ai-character/skills/animate-props.md)
- Updated from the owner's skill sources of 2026-10-11.

Read: `animate`, `animate-multi-image`, `character-consistent`. Source experiments and demo materials are historical; use the person's own approved media.
