AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified Apache-2.0 Self-run

Spark Video Cast

skill-modelstudioai-skills-spark-video-cast · by modelstudioai

Scaffold and generate reference assets for characters (cast), locations (movie-set / set dressing), and key props — the three pillars of visual consistency in spark-video. Wraps bl image generate / edit for portrait creation. Use when adding new characters/locations/props or when costume/state changes are needed.

No reviews yet
0 installs
27 views
0.0% view→install

Install

$ agentstack add skill-modelstudioai-skills-spark-video-cast

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-modelstudioai-skills-spark-video-cast)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
2mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Spark Video Cast? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Cast / Set / Prop Skill — spark-video Art Department (all-in-one)

You are the art department of the pipeline. Your job is to scaffold folder structures and generate reference images for the three things that pin visual consistency:

| Pillar | Pins | Folder pattern | |---|---|---| | Cast | Faces, hairstyle, costume, build | cast// | | Movie-set | Locations, lighting, decor | movie-set// | | Prop | Hero objects that recur or change state | props// |

All three follow the same mental model: one folder = one reference image = one frozen visual state. State changes (day→night, intact→torn, casual→formal) = separate folders.

Set env vars:

export SPARK_VIDEO_PROJECT=
export SPARK_VIDEO_EPISODE=
export SPARK_VIDEO_PHASE=portrait

Two-tier model — project vs episode

Both cast, set, and prop live under two tiers. Episode tier overrides project tier on name collision:

projects//
├── cast//          ← project mains (shared across all episodes)
├── movie-set//     ← project recurring locations (sitcom rooms)
├── props//         ← project recurring hero objects
└── /
    ├── cast//      ← episode NPCs OR project-cast overrides (fork)
    ├── movie-set// ← one-off locations for this episode
    └── props//     ← one-off or state-overrides for this episode

Use the project tier when an asset is shared across episodes (sitcom recurring rooms, series mains). Use the episode tier for one-off NPCs / locations / state-changes (episode-wide costume forks, episode-only hero items, one-off rooms).

⚠ THE ONE-FOLDER-ONE-STATE RULE (hard rule, applies to all 3)

The video model reads reference images literally. Mixing two visual states into one folder produces a muddy averaged intermediate.

| Pillar | "Same X, different…" → separate folder | |---|---| | Cast | Episode-wide costume change (wedding dress / battle wounds / period vs modern) → fork into episode tier | | Set | Time-of-day (day/night), season (spring/autumn), color grade (cool/warm), weather (clear/rain) | | Prop | State (intact/creased/torn), damage (clean/bloodied), open/closed |

Naming convention: -:

  • 同福客栈大堂-白天 / 同福客栈大堂-夜晚
  • 红包-完整 / 红包-起皱 / 红包-撕碎
  • 陆辰-汉服 (forked from 陆辰 for one episode)

Procedure 1 — scaffold a cast

1.1 Lead / project-tier character

# Scaffold the folder + soul card template
uv run scripts/scaffold.py cast --name "陆辰"
# Edit projects//cast/陆辰/cast.md to fill: age, gender, personality, catchphrase,
# visual anchor (one-line appearance), do / don't

Then generate the portrait via bl:

./scripts/bl image generate \
  --model wan2.6-t2i \
  --prompt "28-year-old man, short hair, dark T-shirt, photorealistic style, half-body portrait, $(uv run scripts/scaffold.py mood-anchor)" \
  --size 16:9 \
  --out-dir projects/$SPARK_VIDEO_PROJECT/cast/陆辰/ \
  --out-prefix portrait

Notes:

  • Default model wan2.6-t2i: produces stable cast portraits compatible

with downstream r2v. qwen-image-2.0 is newer but visual style differs; test before switching.

  • Append lore.mood_anchor to every portrait prompt so the visual

style matches the rest of the production. The scaffold.py mood-anchor helper prints lore's mood_anchor for piping.

  • Drop one ground-truth photo into the folder if you have one (real

actor reference, hand-drawn concept art) — it overrides the generated portrait at r2v time.

Optional: voice reference for reference-voice r2v (Wan / bl both support):

  • Drop a 5–10s clean speech sample as voice.mp3 in the cast folder.

1.2 NPC (episode-only)

uv run scripts/scaffold.py cast --name "钱夫人" --episode
# → projects///cast/钱夫人/

./scripts/bl image generate \
  --model wan2.6-t2i \
  --prompt "middle-aged woman, stout build, dark silk hanfu, gold hairpin, shrewd worldly expression, $(uv run scripts/scaffold.py mood-anchor)" \
  --out-dir projects/$SPARK_VIDEO_PROJECT/episode-$SPARK_VIDEO_EPISODE/cast/钱夫人/ \
  --out-prefix portrait

Then re-init the merged cast.json:

uv run scripts/scaffold.py cast-init   # merges project + episode tiers

1.3 Cast fork — episode-wide costume change

When a character needs a different outfit for THIS episode only (wedding, period costume, battle-damaged version), DO NOT solve it in shot prompts. Fork the portrait:

# Deep-copy the project cast folder into the episode, drop old portrait
uv run scripts/scaffold.py cast --fork --name "陆辰" --drop-portraits

# Regenerate the portrait with the new appearance
./scripts/bl image edit \
  --image projects/$SPARK_VIDEO_PROJECT/cast/陆辰/portrait1.png \
  --prompt "Change the character's outfit to a large red traditional Chinese wedding robe and red wedding cap; keep face and hairstyle unchanged, $(uv run scripts/scaffold.py mood-anchor)" \
  --out-dir projects/$SPARK_VIDEO_PROJECT/episode-$SPARK_VIDEO_EPISODE/cast/陆辰/ \
  --out-prefix portrait

uv run scripts/scaffold.py cast-init

bl image edit preserves face identity better than bl image generate for forks — always prefer edit when you have a project-tier portrait to base from.

For pixel-perfect face identity (edit can still drift slightly), drop a hand-edited PNG into the episode cast folder instead of using bl.

Procedure 2 — scaffold a movie-set

2.1 When to scaffold a set

Scaffold whenever:

  • Two or more shots happen in the same location with the same lighting.
  • The location matters enough that drift would be noticeable (recurring

sitcom rooms, hero locations, key emotional spaces).

  • A location returns under DIFFERENT lighting → scaffold one new folder

per lighting state.

Skip for one-shot pass-throughs or pure outdoors with no fixed landmarks.

2.2 Naming — lighting state in the folder name

| Same physical place, different… | Action | |---------------------------------|--------| | Time-of-day (day / dusk / night / pre-dawn) | Separate folders (客栈大堂-白天, 客栈大堂-夜晚) | | Season (spring / summer / autumn / winter) | Separate if visible (willows / snow / red leaves) | | Color grade (memory cold gray / present warm yellow / high-contrast neon) | Separate folders | | Weather (clear / rain / snow / fog) | Separate when weather is in frame | | Decor unchanged, action just moves around the room | Same folder |

2.3 Scaffold + generate

# Project-tier sitcom recurring room
uv run scripts/scaffold.py set --name "同福客栈大堂-白天"

# Episode-tier one-off
uv run scripts/scaffold.py set --name "出租屋客厅-暖灯" --episode

# Generate the reference image (description MUST include the lighting/
# season/tone you committed to in the folder name)
./scripts/bl image generate \
  --model wan2.6-t2i \
  --prompt "Ming-Qing style wooden inn lobby, two-story wooden staircase, red lanterns, three square tables, daytime natural light through windows, warm yellow tone, $(uv run scripts/scaffold.py mood-anchor)" \
  --size 16:9 \
  --out-dir projects/$SPARK_VIDEO_PROJECT/movie-set/同福客栈大堂-白天/ \
  --out-prefix set

# Rebuild movie_set.json
uv run scripts/scaffold.py set-init

The set.md frontmatter has explicit time_of_day / season / color_grade / lighting / weather axes — fill them in. They're informational today, but they're the contract that prevents a future director from reusing a daytime set in a night shot.

Procedure 3 — scaffold a prop

3.1 When to promote an object to a key prop

Promote any object to a key prop when it satisfies either:

  • It appears in 2+ shots and the audience would notice if it changed

shape/material/color/wear (the red envelope in S01-003 → S01-007 → S04-002).

  • It's a story-critical hero object even in a single shot (the ring

proposal close-up; the key reveal).

Skip for background dressing or non-recurring objects whose look doesn't matter to the plot. Budget: 3–6 named props per episode, more is a smell.

3.2 Scaffold + generate

# Project-tier recurring prop (family heirloom)
uv run scripts/scaffold.py prop --name "戒指-完整"

# Episode-tier one-off or state-change
uv run scripts/scaffold.py prop --name "红包-起皱" --episode

# Generate a clean product-style reference image when no photo exists
./scripts/bl image generate \
  --model wan2.6-t2i \
  --prompt "Standard Chinese red envelope, large red hot-stamped pattern, printed with '囍', flat with no creases, pure white background, product photography style, $(uv run scripts/scaffold.py mood-anchor)" \
  --size 1:1 \
  --out-dir projects/$SPARK_VIDEO_PROJECT/props/红包-完整/ \
  --out-prefix prop

# State change — produce creased state as a separate folder + image
./scripts/bl image edit \
  --image projects/$SPARK_VIDEO_PROJECT/props/红包-完整/prop1.png \
  --prompt "Add obvious creases and grip-worn folds to the red envelope; keep color, print, and shape exactly unchanged" \
  --out-dir projects/$SPARK_VIDEO_PROJECT/episode-$SPARK_VIDEO_EPISODE/props/红包-起皱/ \
  --out-prefix prop

# Rebuild props.json
uv run scripts/scaffold.py prop-init

For state changes, always prefer bl image edit with the base state image as input — preserves shape/print/material continuity. bl image generate from scratch will draw a different-looking red envelope each time.

Generation tips (apply to all three)

Mood anchor — append it to every t2i prompt

# Helper that prints lore's mood_anchor for piping:
uv run scripts/scaffold.py mood-anchor

Without it, your asset visual style won't match the rendered shots.

Aspect ratio defaults

| Asset type | --size | |---|---| | Cast portrait (half-body) | 16:9 or 3:4 | | Cast portrait (full-body) | 9:16 | | Set establishing | 16:9 | | Prop (product-style) | 1:1 |

Batch generation in parallel

bl image generate supports --n N --concurrent K — useful when scaffolding many NPCs or sets at once. Each --n produces a candidate; keep the best, delete the rest.

./scripts/bl image generate --n 3 --concurrent 3 \
  --model wan2.6-t2i \
  --prompt "..." \
  --out-dir projects/.../cast/陆辰/ \
  --out-prefix candidate
# → candidate1.png, candidate2.png, candidate3.png; rename winner to portrait1.png

Multi-image merge (cast fork only)

bl image edit accepts multiple --image flags. Useful when forking a cast with a costume reference photo:

./scripts/bl image edit \
  --image cast/陆辰/portrait1.png \
  --image refs/hanfu-reference.png \
  --prompt "Dress the person in 图1 in the hanfu from the reference in 图2; keep face and hairstyle unchanged" \
  --out-dir projects/.../episode-X/cast/陆辰/

After scaffolding — rebuild manifests

The merged manifests (cast.json, movie_set.json, props.json) must be rebuilt after any folder change. They drive the director's shot-id lookups and the renderer's media[] resolution:

uv run scripts/scaffold.py cast-init
uv run scripts/scaffold.py set-init
uv run scripts/scaffold.py prop-init
# or all three:
uv run scripts/scaffold.py manifests

Tell the director (or the producer at GATE 2) when you've added new assets — they need to read the updated manifests before storyboarding any scene that references them.

DON'Ts

  • ❌ Don't put two lighting states (day + night) in the same set folder.

The model averages and produces "neutral gray noon-night" garbage.

  • ❌ Don't put two prop states (intact + creased) in the same prop folder.

Same reason.

  • ❌ Don't solve a costume change by writing "wearing XXX" in shot prompts.

Fork the cast portrait instead.

  • ❌ Don't omit the mood_anchor in t2i prompts. Visual cohesion will

break across shots vs portraits.

  • ❌ Don't use generic names like cast/nurse — name by role+story-id

(cast/nurse-xiaoli). When two episodes both have a "nurse", you can't tell whose portrait is whose.

  • ❌ Don't generate reference images with --watermark. The watermark

becomes a baked-in artifact that drifts into rendered shots.

  • ❌ Don't skip scaffold.py *-init after adding folders. The manifests

are the only thing the rest of the pipeline reads.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.