Cardstock Diorama Myth Animation (Unsora MCP)
One request — a myth, a premise, or nothing at all — becomes a finished narrated
mythic short film in the layered cut-paper diorama style: stacked matte cardstock
worlds, three colours and no others, a storyteller's voice, one final MP4. This is
animation-movie storytelling — gods, monsters, thresholds, transformations —
not a data explainer.
The style, in one line: flat matte cardstock worlds — visible cut edges, soft
contact shadows, a strict three-colour palette and no others — a tiny figure
dead-centre of a huge symmetrical set, rendered in 3D, not real stop-motion,
scenes packed with incident and joined by paper wipes, native impact SFX and
paper foley, landing on a face.
The look is a specification, not a vibe. Palette, exposure and pacing are
numbers, and every failure is a number drifting off target. State targets as
numbers in the prompt, then measure the output (scripts/qc.py). Adjectives don't
survive the trip to the model; percentages do.
The failure this skill exists to prevent is not an ugly clip — it's a boring
one: one slow scene per block, one camera drift, half the runtime doing nothing. It
looks correct and feels dead. Density is the deliverable. The second failure,
specific to story work, is a film that narrates instead of showing: if the voice
is describing what the picture already says, the picture isn't working hard enough.
The tool split (read this — it is the point of the pipeline):
- Everything generated runs on Unsora.
create_image (nano-banana-pro) for
the style key, the reference sheets and any hero frame → create_video
(seedance-2.0) for every block → create_voiceover (ElevenLabs Eleven v3) for
the narration → create_music (mureka-7.5) only if a bed is wanted. Each
create_* is async: poll its matching wait_for_*.
- Assembly is ffmpeg, locally. Unsora has no assembler, so the cut, the
narration placement inside each block window, and the mix are ffmpeg commands you
run yourself. This is an upgrade over any server-side assembler: block windows,
VO centring and wordless blocks are all under your control instead of a server's.
Hard preconditions
- Unsora MCP connected and authenticated. Needs
create_image,
create_video, create_voiceover, list_voiceover_voices, and the matching
wait_for_image / wait_for_video / wait_for_voiceover; create_music +
wait_for_music only if a score is requested. If they're missing, stop and say
so — do not substitute another generator.
- Local
ffmpeg and ffprobe. Not optional here — they are the assembler.
Without them you can generate clips but cannot deliver a film.
- Web search for the lore pass, whenever the story is a real tradition.
- Recommended:
python3 with numpy, pillow, scikit-learn plus curl for
the QC pass. If unavailable, run the eyeball checklist in
references/style-dna.md and say QC was visual only.
Operating mode
Hands-off. The user delegates story choice, palette, script, voice, casting and
assembly.
- Honour anything they specified — the myth, the tradition, the length, the
palette, the voice, the orientation. Decide everything else yourself.
- Right before the first paid generation, post one short plan message (the story
and which variant, palette, block count, the beat sheet in one line each, voice,
rough credit estimate) so the user can interrupt — then proceed immediately
without waiting for approval, unless they asked to be consulted. Note that the
story shortlist below is a separate, earlier stop: by the time this plan message
goes out, the myth is already settled.
- Never stop mid-pipeline to ask what a default answers. Delivering loose clips
instead of one assembled MP4 is a failure.
- One exception: which myth. If the user gave no story, present a shortlist and
wait for their pick (Phase S). Everything downstream — palette, voice, framing,
casting, beats — you still decide. A topical explainer works with any trending
subject, so picking one unasked is fine; a myth is the whole creative premise, and
guessing it wastes the entire run. This is one stop at the front door, not a habit
of asking.
Two style names collide, so be exact: this is the three-colour cardstock
diorama, not the sepia-newsprint censor-bar diorama documentary. Do not use its
letterpress prop text, and do not use any Mixed Media collage preset. This skill
generates its own style key in Phase 1.
Defaults
| Setting |
Default |
Override when… |
| Style key |
Generated in Phase 1 from the cardstock style-key prompt (references/style-dna.md), at the run's aspect ratio |
user supplies their own reference image |
| Palette |
Auto-picked to fit the myth's world and mood (references/palette.md) |
user names one, or the tradition has a strong colour identity |
| Aspect |
16:9 — the concentric top-down hero shot needs the width, and this is a film |
user says shorts/TikTok/Reels → 9:16, and warn the ring beat loses power |
| Length |
1 minute → N = 6 blocks (N = minutes × 6, each block one 10s beat). A myth with a real arc wants 8–12 blocks; recommend 90s–2min if the user is open |
user gives a length (1–10 min) |
| Engine |
create_video, model: "seedance-2.0", resolution: "720p", duration: 10, generateAudio: true |
— |
| Character sheet |
Mandatory for the protagonist, and for any creature or place in 2+ blocks |
a single-location fable with one figure still gets the figure |
| Language |
English narration (prompts stay English regardless) |
user asks otherwise |
| Voice |
Auto-pick a storyteller from the twenty Eleven v3 voices: deep, unhurried, warm, formal — a voice reading a legend aloud, not a news anchor and not an ad read. stability: 0.6 |
user wants to choose → list_voiceover_voices renders the picker; show it and wait |
| Subtitles |
OFF — this style is image-led and a myth plays better uncaptioned |
headed for silent-autoplay social → ON, burned from an ASS file in the ffmpeg pass |
| Music |
None — seedance's native paper foley and impact SFX carry it |
user wants a score → create_music (mureka-7.5), ducked under the VO in the mix |
Story engine
Four things carry a mythic film:
- Every block delivers one nameable event. "What does the viewer see happen
that they didn't a second ago?" — a blade is drawn, a wave swallows a boat, a
body becomes a tree, the sky splits. If you can't name the event in one clause,
the block is a postcard: pack it, fold it, or cut it.
- A 10s block needs two internal paper wipes. A wipe every 3–4 seconds is what
keeps this style dense, so each block runs roughly: event → wipe → event → wipe →
event, plus its join bookends. Never let a 10-second block ride one slow camera
move.
- One talisman travels the whole film. A single physical object carried through
every block and escalating — a thread, a feather, a cracked mask, a lantern, a
seed. In myth this is the story's memory: it enters in the first beat, changes
hands or changes state at the crisis, and pays off in the last frame. Design it
before writing block 1.
- The arc, mapped to blocks. For N = 6 use the short column; for N = 8–12
expand the ordeal.
| Beat |
Story job |
Visual job |
| 1 |
Cold open in the middle of something. An omen, a rupture, the world already breaking. No "long ago there was a…" |
cold open on motion, no leading wipe; deliver the establishing geometry while something violent is underway |
| 2 |
The world and the lack. Who this is, where, and what is wrong or missing |
the tiny figure dead centre of the huge symmetrical set — the format's signature shot |
| 3 |
The threshold. The choice is made, the door opened, the pact struck |
the talisman enters or is claimed; the palette swings to its dark end |
| 4 … N−2 |
The ordeal, escalating. One trial per block, each costlier than the last. Never repeat a beat's shape |
the build — packed, wipe-joined, whiplash the scale: giant face → ant-sized figure → colossal creature |
| N−2 |
The crisis. The lowest point, or the transformation itself |
the biggest impact of the film; flat shards, punched confetti, a full ground-flood or a full void-flood |
| N−1 |
The confrontation. The reckoning, inside the ring |
the ring hero shot — crane straight up, the world resolving into concentric rings around the figure at dead centre |
| N |
The cost, and what remains. What was paid, what changed. End on the image, not a moral |
land on a face — push into an extreme close-up, flat paper features, accent across the eyes, lit as bright as the opening. Ends on the image; no trailing wipe |
Find the ring. The top-down concentric beat needs a circular geometry to fall
into — an arena, a whirlpool, a coiled serpent, a ring of standing stones, a crater,
a spiral stair, a circle of mourners, a labyrinth. Myth is full of them. If the story
seems to have none, find the ring hiding in it (a duel becomes a ring of onlookers; a
funeral becomes a ring of fire). A ring you only look at is a postcard; one something
happens inside is a film.
Narration — sparser than an explainer, and that is the point
~12–18 words per block (an explainer runs 20–24). Mythic register: concrete
nouns, plain verbs, no hedging, no modern idiom, no jokes. Present or simple past,
held consistently. The voice names what cannot be seen — a lineage, a bargain, a
consequence — and stays silent about what the picture already shows.
You centre each take inside its fixed 10s window in the ffmpeg pass, and for a
myth that is a feature, not the bug it is in an explainer: a 16-word line runs
~6.5s and centres with ~1.75s of pure paper foley at each end — the film breathes,
and the impacts land in silence. So aim short deliberately. The ceiling is ≈9.5s
per block; past that there is no air left, and you have to speed-fit the take
(atempo ≤ 1.15) and the storyteller starts to sound rushed. Reshape long lines into
one flowing sentence or cut a clause; narrator voices pause ~0.7s at every period, so
two short sentences cost more time than one longer one.
One or two blocks should carry no narration at all — the crisis and often the
ring shot play stronger silent, on SFX alone. On this pipeline a wordless block is
trivial: generate no voiceover for it and lay nothing over it in the mix. No
workaround, no test needed.
Joins — paper-wipe bookends
- Tail of block N — the final 0.4s: the camera rushes into a blank sheet of the
join colour filling the frame; the clip ends on flat paper, no detail.
- Head of block N+1 — opens on ~0.25s of the same flat colour, then pulls back
into its tableau.
Concatenated, the cut lands between two flat identical-colour frames, so the seam is
invisible; the halves read as one continuous ~0.5s wipe. Ground/light wipes into
bright beats, accent wipes into dark ones — the colour previews the beat it opens,
which in a myth means the wipe carries dread or relief before the image does. The
join colour is a property of the join and must be written into both sides. Never
chain image → lastImage across blocks; the bookends are the join. Wording:
references/style-dna.md §The paper wipe.
This trick is battle-tested against exactly the assembler used here — a local ffmpeg
concat — so there is no uncertainty about how the seam lands. Still inspect the
seams after the concat and report what you see.
Pipeline
| Phase |
What happens |
Tools |
| S Story |
use the given myth, or propose 4–6 and wait for a pick |
reasoning + web search |
| L Lore |
read the actual tradition: variants, names, iconography, the ending |
web search |
| P Palette |
lock one palette for the whole film |
references/palette.md (free) |
| 1 Style key |
generate the cardstock style key at the run's aspect ratio |
create_image (nano-banana-pro) |
| 1b Casting |
sheets for the protagonist, every creature, every recurring place, the talisman |
create_image (nano-banana-pro, 16:9) |
| 2 Beat sheet + narration |
N beats on the arc, ~12–18 words each, 1–2 wordless |
reasoning (free) |
| 3 Block prompts |
N prompts in the diorama language, wipe-bookended, sheets bound |
reasoning (free) — templates in references/style-dna.md |
| 4 Clips |
N × 10s clips, style key + sheets on every one |
create_video (seedance-2.0) |
| 5 Voice |
one storyteller, one take per voiced block |
list_voiceover_voices + create_voiceover |
| 6 Assemble |
concat clips, place + mix the takes, deliver one MP4 |
ffmpeg (local) |
Read references/style-dna.md before Phase 1 and references/unsora.md before
Phase 4. Phases S, L, P, 2, 3 and 6 are free; 1, 1b, 4, 5 cost credits.
Job model: every create_* returns a generation.id. Poll the matching
wait_for_*; a completed job carries a result URL. That URL — not the id — is
what you pass onward: as image and inside referenceImages on create_video, and
to curl for the local copy. Everything from Phase 6 on works on local files. Check
get_credits once before Phase 4 if you want a balance for the plan message.
Phase S — Story
Story given → use it, go to L.
No story → propose 4–6 myths, show them, and wait for a pick. Do not choose
one yourself and start generating; this is the one front-door stop. If the user
answers with a vibe rather than a title ("something with a sea monster"), that counts
as a pick — take the closest candidate and go.
Bias hard toward action-dense spectacle: monsters, sieges, floods, descents into
the underworld, shapeshifting, oaths and bargains with something older than the hero.
What makes a myth work in this style:
- A physical world to build in card — a mountain, a sea, a forge, a maze, a
storm. Abstract theology needs a physical proxy.
- A creature or force with a silhouette — cut paper lives or dies on silhouette,
so a serpent, a wolf, a giant, a wave read beautifully; an unseen dread does not.
- A transformation — this style does metamorphosis better than anything, because
a body becoming a tree is literally one stack of card replaced by another.
- A circular geometry somewhere, for the ring beat.
- An ending that lands on a face — a cost paid, a change worn.
Scope each candidate to the runtime. One myth, or one episode of a larger cycle —
not a whole epic. "The binding of the wolf" is a film; "the Norse myths" is not. If a
tradition only offers an epic, propose the single strongest episode and say which.
Spread the shortlist. Vary the tradition, the scale and the tone — not five Greek
myths, not five monster fights. Include one lighter or stranger option; the trickster
tale is often the one people pick. Lesser-known myths outperform the famous ones: the
audience doesn't know where it's going, and there's no animated-film version in their
head to compete with.
Proposal format — one entry each, so a pick takes seconds:
**[Title] — [tradition]**
[One-line logline: who, the turn, and what it costs.]
Ring: [the circular geometry] · Creature: [the silhouette] ·
Transformation: [what becomes what] · Talisman: [the travelling object]
If a candidate is missing one of those four, say so rather than inventing it — a myth
with no transformation can still be the best pick, and knowing what it lacks tells the
user what the film will lean on instead.
Calibrated seeds (a spread that works; don't just recycle these, but match this
level of concreteness):
| Myth |
Ring |
Creature |
Transformation |
Talisman |
| The binding of Fenrir (Norse) |
the gods ringed around the wolf |
the wolf, growing each attempt |
— (the cost is a hand) |
the silk-thin chain |
| Arachne's contest (Greek) |
the circle of judges at the loom |
— |
woman → spider, on screen |
the tapestry |
| Vasilisa and Baba Yaga (Slavic) |
the fence of skulls around the hut |
the hut on chicken legs |
— |
the skull lantern with fire in it |
| Marduk and Tiamat (Babylonian) |
the coil of the sea itself |
the salt-water serpent |
her body → the sky |
the net of the four winds |
| Nüwa mends the sky (Chinese) |
the hole burned in heaven |
the black turtle |
stone → molten patch |
the five stones |
| Cú Chulainn's warp-spasm (Irish) |
the ford, fighters ringed on both banks |
the man himself, deformed |
hero → monster → hero |
the ford's single stone |
| Anansi buys the stories (West African) |
the ring of animals bearing witness |
the hornets, the python |
— (a trick, not a change) |
the calabash of stories |
| Icarus (Greek) |
the spiral of the labyrinth below |
the sun as a flat disc |
wax → nothing |
the feathered wing |
One caution. Some stories are living sacred tradition rather than public folklore —
especially Indigenous and closed-practice material. Prefer widely published,
public-domain myth; if the user asks for something that reads as sacred or closed, say
so plainly once, offer a near neighbour, and follow their call. Don't lecture, and
don't refuse a myth just because it is religious.
Phase L — Lore
Never write a myth from vibes. Search the tradition and collect: which variant
you're telling (most myths have several irreconcilable versions — pick one and say
which), the names as commonly transliterated, the iconography the tradition
itself uses (what the creature actually looks like in its own art, what the hero
carries, what the place is described as), the ending as the source gives it, and
any detail specific enough to be worth stealing — a number of doors, a colour of
a horse, the thing said at the threshold. Specifics are what make a mythic film feel
found rather than generated.
Then decide what you are changing and own it. Compression is fine; contradicting the
tradition's ending is a choice to make deliberately and mention in the delivery
message.
Do not describe characters as they appear in copyrighted animated films. Render
from the tradition's own iconography. See the moderation and IP notes in
references/unsora.md.
Phase P — Palette
Pick one of the five tested palettes and hold it for the whole film: Reference
(cream/vermilion/navy), Sable (lilac/violet/moss), Cobalt
(cream/vermilion/teal), Iris (cream/violet/forest), Glacier
(ice/vermilion/bitumen). Match the myth's world — the mapping is in
references/palette.md §Picking a palette for a myth. State the choice and the three
hexes in the plan message. The maths, the full prompt-ready ranges, and the rule that
something must oppose the accent by ~140° are in the same file.
Phase 1 — Style key
create_image, model: "nano-banana-pro", aspectRatio = the run's ratio, with the
STYLE KEY prompt from references/style-dna.md §Style key, palette hexes
substituted. wait_for_image, then keep the result URL — that URL is the style
key, and it goes in referenceImages on every clip. QC it before spending on
clips: a bad key poisons the run and re-rolling costs one image.
Phase 1b — Casting (do not skip this)
A myth follows the same figure for its whole runtime, so character drift is the
single biggest technical risk in this skill — a bigger one than palette drift. In
the explainer version sheets were optional; here they are the job.
Generate, before any clip: a character sheet for the protagonist, one for every
creature, and a location sheet for every place appearing in 2+ blocks. Formats
in references/style-dna.md §Reference-sheet formats — always 16:9. The talisman
gets its own sheet too, at 1:1, from the format in §The talisman / prop sheet: it
must stay recognisable at every scale, and a second sheet if it changes state at the
crisis.
Then pass each sheet's URL in referenceImages on every block that uses it, alongside
the style key, and refer to it in the prompt by slot — "the same figure from
@Image2". Mind the slot maths: on create_video, image is @Image1, so the first
referenceImages entry is @Image2. Pass only the sheets that block actually uses; a
dangling reference invites drift, and Seedance caps referenceImages at 9. QC every
sheet and show them in the plan message: a flawed sheet propagates into every block
that references it, and this is the cheapest moment to re-roll.
Phase 2 — Beat sheet + narration
N beats on the arc table above, labelled Block 1 … Block N. For each: the event in
one clause, the wipe-in colour, which sheets it uses, and its narration line
(~12–18 words, or none). Plain spoken text only — no stage directions, no
parentheticals, numbers spelled out. Read the whole narration start to finish aloud:
it should sound like one voice telling one story, not N captions. Cut every line that
describes what the picture already shows.
Phase 3 — Block prompts
One video prompt per block. Each block is a 10-second create_video call that takes
the style key and this block's sheets in referenceImages. Write all N with the
block template in references/style-dna.md, then run the per-block checklist there.
(For the ring block and the final face block, consider the optional hero-frame
lock in style-dna.md: generate that block's opening frame with create_image
first and pass it as image, which buys precision on the two shots that carry the
film.) Non-negotiable in every prompt:
- The medium sentence (stacked matte cardstock, visible cut edges, soft contact
shadows, rendered in 3D) and the AI-default negative.
- The palette stated three ways — hexes with ranges, percentages, and the
exclusion naming the colour you removed.
- The exposure block. Never a global exposure lock — the swing is the style.
- Paper logic named for every element, especially anything entering mid-block, and
for every creature, flame, wave and wound.
- Every camera move pinned to a timecode and forbidden to pause.
- Both wipe bookends with colour and duration (except block 1's head, block N's
tail).
- Sheet binding by slot for every figure, creature, place and the talisman.
- Never the word "hold" — the model freezes on a full-detail frame. Named
micro-motion instead.
- The audio block: native paper foley and impact SFX,
No music. No voice. The
narration is a separate track; a voice inside the clip fights it.
Phase 4 — Clips
Submit N create_video jobs — model: "seedance-2.0", duration: 10,
resolution: "720p", generateAudio: true, aspectRatio identical across the run,
style key plus that block's sheets in referenceImages. Exact call template and the
moderation and IP map are in references/unsora.md. Poll each with wait_for_video,
curl the result to clips/block_NN.mp4, and record every generation id against its
block in the manifest; re-submit only failures.
Violence, the way this style does it. Myth is violent and the style handles it
natively because it is abstract: a wound is a vermilion paper shard, a beheading is
a silhouette and a scatter of punched confetti, a flood is stacked wavy card. Describe
the paper event, never the gore — that keeps the film true to the style and clears
moderation at the same time. Explicit blood and viscera will flag and are off-style
anyway.
QC each clip if the local pass is available:
python scripts/qc.py video clips/block_NN.mp4 --ground '#…' --accent '#…' --void '#…'. Report numbers honestly, failures included — luma swing (target ~150, under
~80 is a dead clip), ground share near 45%, no fourth hue, and the flat head/tail
runs that prove the bookends landed. Re-roll only on a fail; never re-roll a good
block "for consistency" — a re-roll comes back different and breaks the bookend match
with its neighbour.
Phase 5 — Voice
list_voiceover_voices → auto-pick a storyteller from the twenty Eleven v3
voices: deep, unhurried, warm, slightly formal, comfortable with silence. Read the
register off the myth — a Norse saga and a trickster tale don't want the same
voice. Note the exact voice_id and reuse it on every block. If the user wants to
pick, the tool renders a picker with previews: show it and wait, and don't repeat
the voices as a list in your reply.
- One
create_voiceover call per voiced block. stability: 0.6 for a steady
narrator (lower gets theatrical, higher gets flat); leave similarity at its
default. Generate nothing for a wordless block. Poll wait_for_voiceover, curl
each mp3 to vo/vo_NN.mp3.
ffprobe every take for its real duration and record it. A 12–18 word line
landing at 5–8s is correct — the block is 10s and the assembler centres the
take so it opens and closes on foley. Over ≈9.5s there is no air left: cut a
clause or merge two sentences and re-voice that block only, or speed-fit it in the
mix (atempo ≤ 1.15, pitch-safe).
<#0.5#> between words inserts a half-second pause and is worth using at a
threshold line — but a pause spends the same window the silence at each end does, so
check the take still lands under the ceiling.
Phase 6 — Assemble (automatic, mandatory)
The moment all clips and takes are done, assemble in the same run without being
asked. ffprobe the finished clips' real width/height and encode to those —
if the clips rendered in a different aspect than planned, the assembly matches the
clips, not the plan.
- Concat the clips in manifest order. Every join is wipe-bookended, so the cut
lands between two flat identical frames and needs no crossfade.
- Place each take at its block's window:
offset_ms = block_start_ms + (10000 − vo_duration_ms) / 2. That centring is what gives the myth its air, and
on this pipeline it is your arithmetic, not a server's. Wordless blocks get
nothing.
- Mix VO over the clips' native SFX (kept low so impacts read), plus the music
bed ducked under the VO if there is one.
- Verify duration, dimensions and audio streams before presenting.
Exact commands — concat, loudnorm, the centring offsets, the sidechain duck,
verification and resume — are in references/unsora.md §Assembly. Then present
final.mp4 with the host's native file delivery.
Delivery
Final message: the video, the myth and which variant you told in one sentence, the
talisman and what it paid off into, the locked palette (name + three hexes), the full
narration so the user can reuse it, the QC numbers if measured, anything you
deliberately changed from the source, and where you read the tradition. Then offer —
never run unasked — social posting (Unsora create_post, its own explicit yes) or a
titles pass.
Failure handling
| Symptom |
Cause |
Fix |
| The protagonist looks like a different person each block |
No sheet, or sheet not passed |
Sheet first, always; its URL in referenceImages of every block that uses it; describe only pose and action in the prompt, never re-describe the design |
| The creature changes anatomy between blocks |
Same, plus over-description |
One creature sheet, bound everywhere; in the prompt say "the creature from @Image2", then only what it does |
| Film feels like N tableaux, not one story |
No talisman, or the arc wasn't mapped |
Put the object in every block and change its state at the crisis; check each block against the arc table |
| Narration describes what the image shows |
Explainer instinct |
Cut the line to its unseeable half — lineage, bargain, consequence — or drop it and let the block play silent |
| Reads like a scene from an animated feature |
A film's character design leaked into the prompt |
Render from the tradition's own iconography; never name or describe a copyrighted character version |
| Clip is boring — one slow move, half the block dead |
Only one event in a 10s window |
Two internal wipes, three events; purge every "hold" and name micro-motion |
| Renders glossy CGI / photoreal, or grows smoke and volumetrics |
AI-default leaked |
Medium sentence + full negative every time: stacked matte cardstock, visible cut edges, flat shards not smoke, no gloss/specular/lens-flare/DoF |
| Renders as flat vector illustration |
Cut edges and contact shadows not stated |
Name both explicitly; they are the signature |
| Clip drifts dark (interiors, caves, night, close-ups) |
No exposure block, or a global lock |
Exposure block from attempt one; pin close-ups "as bright as the opening"; never "hold the balance every frame" |
| Palette drifts / a fourth colour / accent floods |
Ground collapsed, or nothing opposes the accent |
State the palette three ways; name the removed colour; check something opposes the accent ~140° |
| Camera move never happens or arrives late |
Move unpinned |
Pin to a timecode and forbid pausing |
| Visible hard cut at a seam |
Bookends missing or colours mismatched |
Same flat join colour on outgoing tail and incoming head; verify flat runs with qc.py video |
| A low continuous drone under the biggest move |
Seedance adds it unasked |
Ban the sustain, not the frequency: "no sustained tone, no cinematic drone, no continuous hum"; keep "heavy card dropped flat" so impacts keep body |
| Clip contains a voice |
Narration leaked into the video prompt |
No voice. in every prompt; the voice exists only in the mix |
Video job FAILED with no error text |
Moderation, not luck |
Usually violence described as gore rather than as paper — rewrite it as shards and silhouette. See the map in unsora.md |
| Storyteller sounds rushed |
Take over ~9.5s, so it was speed-fitted |
Cut a clause or merge two sentences into one; re-voice that block only |
| Assembled film is short |
A clip failed and got skipped by the concat |
Check the manifest, regenerate the missing block, re-concat — a concat that drops a clip still yields a valid file |
| Clips won't stream-copy concat |
A clip came back a different size |
Every clip must be 720p at the same ratio; regenerate the odd one and re-verify |
| The mix is 6 dB quiet |
amix without normalize=0 |
normalize=0 on every amix — it is not optional |
Reference files
references/style-dna.md — the full cardstock visual system: locked slots, paper
logic (including creatures, water, fire and wounds), exposure swing, camera,
motion, audio vocabulary, the AI-default negative, the wipe wording, the
style-key prompt, the block-prompt template with a worked mythic example,
sheet formats, and the per-block checklist. Read before writing any prompt.
references/palette.md — the palette maths, the five tested palettes plus one
documented failure, prompt-ready ranges for all five, how to state a palette three
ways, palette-by-myth-world, and how to build a sixth with scripts/palette.py.
references/unsora.md — exact Unsora call templates for every phase, the job and
polling model, the manifest schema, the moderation and IP map, cost arithmetic,
every ffmpeg command for the assembly, verification, resume-after-failure, and the
optional posting flow.
scripts/qc.py — measures frames (frame) and clips (video) against the
palette, exposure and wipe targets. python scripts/qc.py --help.
scripts/palette.py — solves a new three-colour palette at the right luma values.
1---2name: cardstock-diorama-myth-animation3description: Produce a complete narrated MYTHIC SHORT FILM end-to-end on Unsora MCP in the layered cut-paper diorama style — stacked matte cardstock worlds, a strict three-colour palette, exposure that swings, paper wipes hiding every seam, landing on a face. Animation-movie storytelling, not an explainer: gods, monsters, heroes, folklore, origin myths and transformations, told in ten-second story beats with a mythic narrator, native paper foley, and one assembled MP4. Use whenever the user wants a myth, legend, fable, folktale or fairy-tale short, a cut-paper or papercraft animated story, "tell the story of X" as a video, a stop-motion-look mythic film, or says "run the cardstock diorama myth animation" or "run the diorama myth pipeline" — even with no story given, since the skill proposes myths itself. NOT for fact-driven explainers with charts and statistics (that is vox-motion-graphics).4---56# Cardstock Diorama Myth Animation (Unsora MCP)78One request — a myth, a premise, or nothing at all — becomes a finished narrated9mythic short film in the layered cut-paper diorama style: stacked matte cardstock10worlds, three colours and no others, a storyteller's voice, one final MP4. This is11**animation-movie storytelling** — gods, monsters, thresholds, transformations —12not a data explainer.1314**The style, in one line:** flat matte cardstock worlds — visible cut edges, soft15contact shadows, a strict **three-colour palette and no others** — a tiny figure16dead-centre of a huge symmetrical set, **rendered in 3D, not real stop-motion**,17scenes packed with incident and joined by **paper wipes**, native impact SFX and18paper foley, landing on a face.1920**The look is a specification, not a vibe.** Palette, exposure and pacing are21numbers, and every failure is a number drifting off target. State targets as22numbers in the prompt, then measure the output (`scripts/qc.py`). Adjectives don't23survive the trip to the model; percentages do.2425**The failure this skill exists to prevent** is not an ugly clip — it's a **boring**26one: one slow scene per block, one camera drift, half the runtime doing nothing. It27looks correct and feels dead. **Density is the deliverable.** The second failure,28specific to story work, is a film that *narrates* instead of *showing*: if the voice29is describing what the picture already says, the picture isn't working hard enough.3031**The tool split (read this — it is the point of the pipeline):**3233- **Everything generated runs on Unsora.** `create_image` (`nano-banana-pro`) for34 the style key, the reference sheets and any hero frame → `create_video`35 (`seedance-2.0`) for every block → `create_voiceover` (ElevenLabs Eleven v3) for36 the narration → `create_music` (`mureka-7.5`) only if a bed is wanted. Each37 `create_*` is async: poll its matching `wait_for_*`.38- **Assembly is ffmpeg, locally.** Unsora has no assembler, so the cut, the39 narration placement inside each block window, and the mix are ffmpeg commands you40 run yourself. This is an upgrade over any server-side assembler: block windows,41 VO centring and wordless blocks are all under your control instead of a server's.4243## Hard preconditions4445- **Unsora MCP connected and authenticated.** Needs `create_image`,46 `create_video`, `create_voiceover`, `list_voiceover_voices`, and the matching47 `wait_for_image` / `wait_for_video` / `wait_for_voiceover`; `create_music` +48 `wait_for_music` only if a score is requested. If they're missing, stop and say49 so — do not substitute another generator.50- **Local `ffmpeg` and `ffprobe`.** Not optional here — they *are* the assembler.51 Without them you can generate clips but cannot deliver a film.52- **Web search** for the lore pass, whenever the story is a real tradition.53- **Recommended:** `python3` with `numpy`, `pillow`, `scikit-learn` plus `curl` for54 the QC pass. If unavailable, run the eyeball checklist in55 `references/style-dna.md` and say QC was visual only.5657## Operating mode5859Hands-off. The user delegates story choice, palette, script, voice, casting and60assembly.6162- Honour anything they specified — the myth, the tradition, the length, the63 palette, the voice, the orientation. Decide everything else yourself.64- Right before the first **paid** generation, post one short plan message (the story65 and which variant, palette, block count, the beat sheet in one line each, voice,66 rough credit estimate) so the user can interrupt — then **proceed immediately67 without waiting for approval**, unless they asked to be consulted. Note that the68 story shortlist below is a separate, earlier stop: by the time this plan message69 goes out, the myth is already settled.70- Never stop mid-pipeline to ask what a default answers. Delivering loose clips71 instead of one assembled MP4 is a failure.72- **One exception: which myth.** If the user gave no story, present a shortlist and73 wait for their pick (Phase S). Everything downstream — palette, voice, framing,74 casting, beats — you still decide. A topical explainer works with any trending75 subject, so picking one unasked is fine; a myth is the whole creative premise, and76 guessing it wastes the entire run. This is one stop at the front door, not a habit77 of asking.7879Two style names collide, so be exact: this is the **three-colour cardstock**80diorama, *not* the sepia-newsprint censor-bar diorama documentary. Do not use its81letterpress prop text, and do not use any Mixed Media collage preset. This skill82generates its own style key in Phase 1.8384## Defaults8586| Setting | Default | Override when… |87|---|---|---|88| Style key | Generated in Phase 1 from the cardstock style-key prompt (`references/style-dna.md`), at the run's aspect ratio | user supplies their own reference image |89| Palette | Auto-picked to fit the myth's world and mood (`references/palette.md`) | user names one, or the tradition has a strong colour identity |90| Aspect | **16:9** — the concentric top-down hero shot needs the width, and this is a film | user says shorts/TikTok/Reels → 9:16, and warn the ring beat loses power |91| Length | 1 minute → N = 6 blocks (N = minutes × 6, each block one 10s beat). A myth with a real arc wants **8–12 blocks**; recommend 90s–2min if the user is open | user gives a length (1–10 min) |92| Engine | `create_video`, `model: "seedance-2.0"`, `resolution: "720p"`, `duration: 10`, `generateAudio: true` | — |93| Character sheet | **Mandatory** for the protagonist, and for any creature or place in 2+ blocks | a single-location fable with one figure still gets the figure |94| Language | English narration (prompts stay English regardless) | user asks otherwise |95| Voice | Auto-pick a **storyteller** from the twenty Eleven v3 voices: deep, unhurried, warm, formal — a voice reading a legend aloud, not a news anchor and not an ad read. `stability: 0.6` | user wants to choose → `list_voiceover_voices` renders the picker; show it and wait |96| Subtitles | **OFF** — this style is image-led and a myth plays better uncaptioned | headed for silent-autoplay social → ON, burned from an ASS file in the ffmpeg pass |97| Music | None — seedance's native paper foley and impact SFX carry it | user wants a score → `create_music` (`mureka-7.5`), ducked under the VO in the mix |9899## Story engine100101Four things carry a mythic film:102103- **Every block delivers one nameable event.** *"What does the viewer see happen104 that they didn't a second ago?"* — a blade is drawn, a wave swallows a boat, a105 body becomes a tree, the sky splits. If you can't name the event in one clause,106 the block is a postcard: pack it, fold it, or cut it.107- **A 10s block needs two internal paper wipes.** A wipe every 3–4 seconds is what108 keeps this style dense, so each block runs roughly: event → wipe → event → wipe →109 event, plus its join bookends. Never let a 10-second block ride one slow camera110 move.111- **One talisman travels the whole film.** A single physical object carried through112 every block and escalating — a thread, a feather, a cracked mask, a lantern, a113 seed. In myth this is the story's memory: it enters in the first beat, changes114 hands or changes state at the crisis, and pays off in the last frame. Design it115 before writing block 1.116- **The arc, mapped to blocks.** For N = 6 use the short column; for N = 8–12117 expand the ordeal.118119| Beat | Story job | Visual job |120|---|---|---|121| 1 | **Cold open in the middle of something.** An omen, a rupture, the world already breaking. No "long ago there was a…" | cold open on motion, no leading wipe; deliver the establishing geometry *while* something violent is underway |122| 2 | **The world and the lack.** Who this is, where, and what is wrong or missing | the tiny figure dead centre of the huge symmetrical set — the format's signature shot |123| 3 | **The threshold.** The choice is made, the door opened, the pact struck | the talisman enters or is claimed; the palette swings to its dark end |124| 4 … N−2 | **The ordeal, escalating.** One trial per block, each costlier than the last. Never repeat a beat's shape | the build — packed, wipe-joined, whiplash the scale: giant face → ant-sized figure → colossal creature |125| N−2 | **The crisis.** The lowest point, or the transformation itself | the biggest impact of the film; flat shards, punched confetti, a full ground-flood or a full void-flood |126| N−1 | **The confrontation.** The reckoning, inside the ring | **the ring hero shot** — crane straight up, the world resolving into concentric rings around the figure at dead centre |127| N | **The cost, and what remains.** What was paid, what changed. End on the image, not a moral | **land on a face** — push into an extreme close-up, flat paper features, accent across the eyes, lit as bright as the opening. Ends on the image; no trailing wipe |128129**Find the ring.** The top-down concentric beat needs a circular geometry to fall130into — an arena, a whirlpool, a coiled serpent, a ring of standing stones, a crater,131a spiral stair, a circle of mourners, a labyrinth. Myth is full of them. If the story132seems to have none, find the ring hiding in it (a duel becomes a ring of onlookers; a133funeral becomes a ring of fire). A ring you only look at is a postcard; one something134happens inside is a film.135136## Narration — sparser than an explainer, and that is the point137138**~12–18 words per block** (an explainer runs 20–24). Mythic register: concrete139nouns, plain verbs, no hedging, no modern idiom, no jokes. Present or simple past,140held consistently. The voice names what cannot be seen — a lineage, a bargain, a141consequence — and stays silent about what the picture already shows.142143You centre each take inside its fixed 10s window in the ffmpeg pass, and **for a144myth that is a feature, not the bug it is in an explainer**: a 16-word line runs145~6.5s and centres with ~1.75s of pure paper foley at each end — the film breathes,146and the impacts land in silence. So aim short deliberately. The **ceiling is ≈9.5s**147per block; past that there is no air left, and you have to speed-fit the take148(`atempo` ≤ 1.15) and the storyteller starts to sound rushed. Reshape long lines into149one flowing sentence or cut a clause; narrator voices pause ~0.7s at every period, so150two short sentences cost more time than one longer one.151152**One or two blocks should carry no narration at all** — the crisis and often the153ring shot play stronger silent, on SFX alone. On this pipeline a wordless block is154trivial: generate no voiceover for it and lay nothing over it in the mix. No155workaround, no test needed.156157## Joins — paper-wipe bookends158159- **Tail of block N** — the final 0.4s: the camera rushes into a blank sheet of the160 join colour filling the frame; the clip ends on flat paper, no detail.161- **Head of block N+1** — opens on ~0.25s of the same flat colour, then pulls back162 into its tableau.163164Concatenated, the cut lands between two flat identical-colour frames, so the seam is165invisible; the halves read as one continuous ~0.5s wipe. **Ground/light wipes into166bright beats, accent wipes into dark ones** — the colour previews the beat it opens,167which in a myth means the wipe carries dread or relief before the image does. The168join colour is a property of the join and must be written into both sides. Never169chain `image` → `lastImage` across blocks; the bookends are the join. Wording:170`references/style-dna.md` §The paper wipe.171172This trick is battle-tested against exactly the assembler used here — a local ffmpeg173concat — so there is no uncertainty about how the seam lands. Still inspect the174seams after the concat and report what you see.175176## Pipeline177178| Phase | What happens | Tools |179|---|---|---|180| S Story | use the given myth, or propose 4–6 and **wait for a pick** | reasoning + web search |181| L Lore | read the actual tradition: variants, names, iconography, the ending | web search |182| P Palette | lock one palette for the whole film | `references/palette.md` (free) |183| 1 Style key | generate the cardstock style key at the run's aspect ratio | `create_image` (`nano-banana-pro`) |184| 1b Casting | sheets for the protagonist, every creature, every recurring place, the talisman | `create_image` (`nano-banana-pro`, 16:9) |185| 2 Beat sheet + narration | N beats on the arc, ~12–18 words each, 1–2 wordless | reasoning (free) |186| 3 Block prompts | N prompts in the diorama language, wipe-bookended, sheets bound | reasoning (free) — templates in `references/style-dna.md` |187| 4 Clips | N × 10s clips, style key + sheets on every one | `create_video` (`seedance-2.0`) |188| 5 Voice | one storyteller, one take per voiced block | `list_voiceover_voices` + `create_voiceover` |189| 6 Assemble | concat clips, place + mix the takes, deliver one MP4 | ffmpeg (local) |190191Read `references/style-dna.md` before Phase 1 and `references/unsora.md` before192Phase 4. Phases S, L, P, 2, 3 and 6 are free; 1, 1b, 4, 5 cost credits.193194**Job model:** every `create_*` returns a `generation.id`. Poll the matching195`wait_for_*`; a completed job carries a **result URL**. That URL — not the id — is196what you pass onward: as `image` and inside `referenceImages` on `create_video`, and197to `curl` for the local copy. Everything from Phase 6 on works on local files. Check198`get_credits` once before Phase 4 if you want a balance for the plan message.199200## Phase S — Story201202**Story given** → use it, go to L.203204**No story** → **propose 4–6 myths, show them, and wait for a pick.** Do not choose205one yourself and start generating; this is the one front-door stop. If the user206answers with a vibe rather than a title ("something with a sea monster"), that counts207as a pick — take the closest candidate and go.208209Bias hard toward **action-dense spectacle**: monsters, sieges, floods, descents into210the underworld, shapeshifting, oaths and bargains with something older than the hero.211What makes a myth work in *this* style:212213- **A physical world to build in card** — a mountain, a sea, a forge, a maze, a214 storm. Abstract theology needs a physical proxy.215- **A creature or force with a silhouette** — cut paper lives or dies on silhouette,216 so a serpent, a wolf, a giant, a wave read beautifully; an unseen dread does not.217- **A transformation** — this style does metamorphosis better than anything, because218 a body becoming a tree is literally one stack of card replaced by another.219- **A circular geometry** somewhere, for the ring beat.220- **An ending that lands on a face** — a cost paid, a change worn.221222**Scope each candidate to the runtime.** One myth, or one episode of a larger cycle —223not a whole epic. "The binding of the wolf" is a film; "the Norse myths" is not. If a224tradition only offers an epic, propose the single strongest episode and say which.225226**Spread the shortlist.** Vary the tradition, the scale and the tone — not five Greek227myths, not five monster fights. Include one lighter or stranger option; the trickster228tale is often the one people pick. Lesser-known myths outperform the famous ones: the229audience doesn't know where it's going, and there's no animated-film version in their230head to compete with.231232**Proposal format** — one entry each, so a pick takes seconds:233234```235**[Title] — [tradition]**236[One-line logline: who, the turn, and what it costs.]237Ring: [the circular geometry] · Creature: [the silhouette] ·238Transformation: [what becomes what] · Talisman: [the travelling object]239```240241If a candidate is missing one of those four, say so rather than inventing it — a myth242with no transformation can still be the best pick, and knowing what it lacks tells the243user what the film will lean on instead.244245**Calibrated seeds** (a spread that works; don't just recycle these, but match this246level of concreteness):247248| Myth | Ring | Creature | Transformation | Talisman |249|---|---|---|---|---|250| The binding of Fenrir (Norse) | the gods ringed around the wolf | the wolf, growing each attempt | — (the cost is a hand) | the silk-thin chain |251| Arachne's contest (Greek) | the circle of judges at the loom | — | woman → spider, on screen | the tapestry |252| Vasilisa and Baba Yaga (Slavic) | the fence of skulls around the hut | the hut on chicken legs | — | the skull lantern with fire in it |253| Marduk and Tiamat (Babylonian) | the coil of the sea itself | the salt-water serpent | her body → the sky | the net of the four winds |254| Nüwa mends the sky (Chinese) | the hole burned in heaven | the black turtle | stone → molten patch | the five stones |255| Cú Chulainn's warp-spasm (Irish) | the ford, fighters ringed on both banks | the man himself, deformed | hero → monster → hero | the ford's single stone |256| Anansi buys the stories (West African) | the ring of animals bearing witness | the hornets, the python | — (a trick, not a change) | the calabash of stories |257| Icarus (Greek) | the spiral of the labyrinth below | the sun as a flat disc | wax → nothing | the feathered wing |258259**One caution.** Some stories are living sacred tradition rather than public folklore —260especially Indigenous and closed-practice material. Prefer widely published,261public-domain myth; if the user asks for something that reads as sacred or closed, say262so plainly once, offer a near neighbour, and follow their call. Don't lecture, and263don't refuse a myth just because it is religious.264265## Phase L — Lore266267Never write a myth from vibes. Search the tradition and collect: **which variant**268you're telling (most myths have several irreconcilable versions — pick one and say269which), the **names** as commonly transliterated, the **iconography** the tradition270itself uses (what the creature actually looks like in its own art, what the hero271carries, what the place is described as), the **ending** as the source gives it, and272any **detail specific enough to be worth stealing** — a number of doors, a colour of273a horse, the thing said at the threshold. Specifics are what make a mythic film feel274found rather than generated.275276Then decide what you are changing and own it. Compression is fine; contradicting the277tradition's ending is a choice to make deliberately and mention in the delivery278message.279280**Do not** describe characters as they appear in copyrighted animated films. Render281from the tradition's own iconography. See the moderation and IP notes in282`references/unsora.md`.283284## Phase P — Palette285286Pick one of the five tested palettes and hold it for the whole film: **Reference**287(cream/vermilion/navy), **Sable** (lilac/violet/moss), **Cobalt**288(cream/vermilion/teal), **Iris** (cream/violet/forest), **Glacier**289(ice/vermilion/bitumen). Match the myth's world — the mapping is in290`references/palette.md` §Picking a palette for a myth. State the choice and the three291hexes in the plan message. The maths, the full prompt-ready ranges, and the rule that292**something must oppose the accent by ~140°** are in the same file.293294## Phase 1 — Style key295296`create_image`, `model: "nano-banana-pro"`, `aspectRatio` = the run's ratio, with the297STYLE KEY prompt from `references/style-dna.md` §Style key, palette hexes298substituted. `wait_for_image`, then keep the **result URL** — that URL is the style299key, and it goes in `referenceImages` on **every** clip. QC it before spending on300clips: a bad key poisons the run and re-rolling costs one image.301302## Phase 1b — Casting (do not skip this)303304A myth follows the same figure for its whole runtime, so **character drift is the305single biggest technical risk in this skill** — a bigger one than palette drift. In306the explainer version sheets were optional; here they are the job.307308Generate, before any clip: a **character sheet for the protagonist**, one for **every309creature**, and a **location sheet for every place appearing in 2+ blocks**. Formats310in `references/style-dna.md` §Reference-sheet formats — always 16:9. The talisman311gets its own sheet too, at 1:1, from the format in §The talisman / prop sheet: it312must stay recognisable at every scale, and a second sheet if it changes state at the313crisis.314315Then pass each sheet's URL in `referenceImages` on every block that uses it, alongside316the style key, and refer to it in the prompt by slot — "the same figure from317@Image2". Mind the slot maths: on `create_video`, `image` is @Image1, so the first318`referenceImages` entry is @Image2. Pass only the sheets that block actually uses; a319dangling reference invites drift, and Seedance caps `referenceImages` at 9. QC every320sheet and show them in the plan message: a flawed sheet propagates into every block321that references it, and this is the cheapest moment to re-roll.322323## Phase 2 — Beat sheet + narration324325N beats on the arc table above, labelled `Block 1 … Block N`. For each: the event in326one clause, the wipe-in colour, which sheets it uses, and its narration line327(~12–18 words, or **none**). Plain spoken text only — no stage directions, no328parentheticals, numbers spelled out. Read the whole narration start to finish aloud:329it should sound like one voice telling one story, not N captions. Cut every line that330describes what the picture already shows.331332## Phase 3 — Block prompts333334One video prompt per block. Each block is a 10-second `create_video` call that takes335the style key and this block's sheets in `referenceImages`. Write all N with the336block template in `references/style-dna.md`, then run the per-block checklist there.337(For the ring block and the final face block, consider the optional **hero-frame338lock** in `style-dna.md`: generate that block's opening frame with `create_image`339first and pass it as `image`, which buys precision on the two shots that carry the340film.) Non-negotiable in every prompt:341342- The medium sentence (stacked matte cardstock, visible cut edges, soft contact343 shadows, rendered in 3D) **and** the AI-default negative.344- The palette stated **three ways** — hexes with ranges, percentages, and the345 exclusion naming the colour you removed.346- The exposure block. **Never a global exposure lock** — the swing is the style.347- Paper logic named for every element, especially anything entering mid-block, and348 for every creature, flame, wave and wound.349- Every camera move pinned to a timecode and forbidden to pause.350- Both wipe bookends with colour and duration (except block 1's head, block N's351 tail).352- Sheet binding by slot for every figure, creature, place and the talisman.353- **Never the word "hold"** — the model freezes on a full-detail frame. Named354 micro-motion instead.355- The audio block: native paper foley and impact SFX, `No music. No voice.` The356 narration is a separate track; a voice inside the clip fights it.357358## Phase 4 — Clips359360Submit N `create_video` jobs — `model: "seedance-2.0"`, `duration: 10`,361`resolution: "720p"`, `generateAudio: true`, `aspectRatio` identical across the run,362style key plus that block's sheets in `referenceImages`. Exact call template and the363moderation and IP map are in `references/unsora.md`. Poll each with `wait_for_video`,364`curl` the result to `clips/block_NN.mp4`, and record every generation id against its365block in the manifest; re-submit only failures.366367**Violence, the way this style does it.** Myth is violent and the style handles it368natively *because* it is abstract: a wound is a vermilion paper shard, a beheading is369a silhouette and a scatter of punched confetti, a flood is stacked wavy card. Describe370the paper event, never the gore — that keeps the film true to the style and clears371moderation at the same time. Explicit blood and viscera will flag and are off-style372anyway.373374QC each clip if the local pass is available:375`python scripts/qc.py video clips/block_NN.mp4 --ground '#…' --accent '#…' --void376'#…'`. Report numbers honestly, failures included — luma swing (target ~150, under377~80 is a dead clip), ground share near 45%, no fourth hue, and the flat head/tail378runs that prove the bookends landed. Re-roll only on a fail; never re-roll a good379block "for consistency" — a re-roll comes back different and breaks the bookend match380with its neighbour.381382## Phase 5 — Voice3833841. `list_voiceover_voices` → auto-pick a **storyteller** from the twenty Eleven v3385 voices: deep, unhurried, warm, slightly formal, comfortable with silence. Read the386 register off the myth — a Norse saga and a trickster tale don't want the same387 voice. Note the exact `voice_id` and reuse it on every block. If the user wants to388 pick, the tool renders a picker with previews: show it and wait, and don't repeat389 the voices as a list in your reply.3902. One `create_voiceover` call per **voiced** block. `stability: 0.6` for a steady391 narrator (lower gets theatrical, higher gets flat); leave `similarity` at its392 default. Generate nothing for a wordless block. Poll `wait_for_voiceover`, `curl`393 each mp3 to `vo/vo_NN.mp3`.3943. `ffprobe` every take for its real duration and record it. A 12–18 word line395 landing at **5–8s is correct** — the block is 10s and the assembler centres the396 take so it opens and closes on foley. Over **≈9.5s** there is no air left: cut a397 clause or merge two sentences and re-voice that block only, or speed-fit it in the398 mix (`atempo` ≤ 1.15, pitch-safe).399400`<#0.5#>` between words inserts a half-second pause and is worth using at a401threshold line — but a pause spends the same window the silence at each end does, so402check the take still lands under the ceiling.403404## Phase 6 — Assemble (automatic, mandatory)405406The moment all clips and takes are done, assemble in the same run without being407asked. `ffprobe` the finished clips' real `width`/`height` and encode to **those** —408if the clips rendered in a different aspect than planned, the assembly matches the409clips, not the plan.4104111. **Concat** the clips in manifest order. Every join is wipe-bookended, so the cut412 lands between two flat identical frames and needs no crossfade.4132. **Place each take** at its block's window: `offset_ms = block_start_ms +414 (10000 − vo_duration_ms) / 2`. That centring is what gives the myth its air, and415 on this pipeline it is your arithmetic, not a server's. Wordless blocks get416 nothing.4173. **Mix** VO over the clips' native SFX (kept low so impacts read), plus the music418 bed ducked under the VO if there is one.4194. **Verify** duration, dimensions and audio streams before presenting.420421Exact commands — concat, loudnorm, the centring offsets, the sidechain duck,422verification and resume — are in `references/unsora.md` §Assembly. Then present423`final.mp4` with the host's native file delivery.424425## Delivery426427Final message: the video, the myth and which variant you told in one sentence, the428talisman and what it paid off into, the locked palette (name + three hexes), the full429narration so the user can reuse it, the QC numbers if measured, anything you430deliberately changed from the source, and where you read the tradition. Then offer —431never run unasked — social posting (Unsora `create_post`, its own explicit yes) or a432titles pass.433434## Failure handling435436| Symptom | Cause | Fix |437|---|---|---|438| The protagonist looks like a different person each block | No sheet, or sheet not passed | Sheet first, always; its URL in `referenceImages` of every block that uses it; describe only pose and action in the prompt, never re-describe the design |439| The creature changes anatomy between blocks | Same, plus over-description | One creature sheet, bound everywhere; in the prompt say "the creature from @Image2", then only what it does |440| Film feels like N tableaux, not one story | No talisman, or the arc wasn't mapped | Put the object in every block and change its state at the crisis; check each block against the arc table |441| Narration describes what the image shows | Explainer instinct | Cut the line to its unseeable half — lineage, bargain, consequence — or drop it and let the block play silent |442| Reads like a scene from an animated feature | A film's character design leaked into the prompt | Render from the tradition's own iconography; never name or describe a copyrighted character version |443| Clip is boring — one slow move, half the block dead | Only one event in a 10s window | Two internal wipes, three events; purge every "hold" and name micro-motion |444| Renders glossy CGI / photoreal, or grows smoke and volumetrics | AI-default leaked | Medium sentence + full negative every time: stacked matte cardstock, visible cut edges, flat shards not smoke, no gloss/specular/lens-flare/DoF |445| Renders as flat vector illustration | Cut edges and contact shadows not stated | Name both explicitly; they are the signature |446| Clip drifts dark (interiors, caves, night, close-ups) | No exposure block, or a global lock | Exposure block from attempt one; pin close-ups "as bright as the opening"; never "hold the balance every frame" |447| Palette drifts / a fourth colour / accent floods | Ground collapsed, or nothing opposes the accent | State the palette three ways; name the removed colour; check something opposes the accent ~140° |448| Camera move never happens or arrives late | Move unpinned | Pin to a timecode and forbid pausing |449| Visible hard cut at a seam | Bookends missing or colours mismatched | Same flat join colour on outgoing tail and incoming head; verify flat runs with `qc.py video` |450| A low continuous drone under the biggest move | Seedance adds it unasked | Ban the sustain, not the frequency: "no sustained tone, no cinematic drone, no continuous hum"; keep "heavy card dropped flat" so impacts keep body |451| Clip contains a voice | Narration leaked into the video prompt | `No voice.` in every prompt; the voice exists only in the mix |452| Video job `FAILED` with no error text | Moderation, not luck | Usually violence described as gore rather than as paper — rewrite it as shards and silhouette. See the map in `unsora.md` |453| Storyteller sounds rushed | Take over ~9.5s, so it was speed-fitted | Cut a clause or merge two sentences into one; re-voice that block only |454| Assembled film is short | A clip failed and got skipped by the concat | Check the manifest, regenerate the missing block, re-concat — a concat that drops a clip still yields a valid file |455| Clips won't stream-copy concat | A clip came back a different size | Every clip must be 720p at the same ratio; regenerate the odd one and re-verify |456| The mix is 6 dB quiet | `amix` without `normalize=0` | `normalize=0` on every `amix` — it is not optional |457458## Reference files459460- `references/style-dna.md` — the full cardstock visual system: locked slots, paper461 logic (including creatures, water, fire and wounds), exposure swing, camera,462 motion, audio vocabulary, the AI-default negative, the wipe wording, the463 **style-key prompt**, the **block-prompt template** with a worked mythic example,464 sheet formats, and the per-block checklist. **Read before writing any prompt.**465- `references/palette.md` — the palette maths, the five tested palettes plus one466 documented failure, prompt-ready ranges for all five, how to state a palette three467 ways, palette-by-myth-world, and how to build a sixth with `scripts/palette.py`.468- `references/unsora.md` — exact Unsora call templates for every phase, the job and469 polling model, the manifest schema, the moderation and IP map, cost arithmetic,470 every ffmpeg command for the assembly, verification, resume-after-failure, and the471 optional posting flow.472- `scripts/qc.py` — measures frames (`frame`) and clips (`video`) against the473 palette, exposure and wipe targets. `python scripts/qc.py --help`.474- `scripts/palette.py` — solves a new three-colour palette at the right luma values.