Claude Skill

scenario-seedance-storyboard

Use when a Seedance video must hold continuous movement across shots: dance choreography, fights, sports, or any performance where limbs teleport, feet slide, or motion resets at every cut, or when turning a storyboard and character sheet into a multi-shot sequence that plays as

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download scenario-labs-skills-skills_scenario-seedance-storyboard-dc592af.zip · 25 KB
Part of scenario-labs/skills — 97 skills

Install

skills CLI npx skills add https://github.com/scenario-labs/skills/tree/main/skills/scenario-seedance-storyboard
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install scenario-labs-skills@llmmart
Git git clone https://github.com/scenario-labs/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole scenario-labs/skills collection as a plugin from our marketplace. Git is the plain clone.

README

How this skill was built

Maintainer notes, not runtime instructions. Every rule in SKILL.md below is tied to the live run that produced it, so a future edit can check whether the evidence still holds rather than re-arguing from taste. All runs used Seedance 2.5 and GPT Image 2 through the Scenario MCP server.

Why a separate skill

The pose-chain workflow existed nowhere in the repo: the only trace was one sentence in scenario-seedance-music-video/references/shots.md, a supporting file of a different skill. It could not be folded into scenario-seedance either, because that body was already at the top of the house word target and the combined text would have blown the hard cap. The triggering conditions also differ: the family skill fires on parameter and conditioning questions, this one fires on a symptom ("limbs teleport", "motion resets at every cut"). A baseline probe with no skill installed had the agent reconstruct the chaining mechanism itself and flag it as guesswork.

Decisions and the evidence

Pencil panels with photographic plates, not photoreal panels

Reversed twice, and the second reversal is the one that holds. The skill first said pencil, then said photoreal on the strength of a 2x2 test, and now says pencil again because that test never contained the cell that matters.

The 2x2 compared board style against number placement with the character sheet held constant, and concluded photoreal because pencil-plus-render-sheet drifted toward posed action-figure plastic. What it never ran cleanly was pencil board plus a photographic plate. That cell was finally measured with the prompt held byte-identical and only the register changed:

  • Photoreal board: the panel numeral leaked into 6 of 8 delivered shots, despite an explicit negative clause naming it. The quality gate had flagged that numeral as "an unwanted watermark" on all 24 panels of the earlier boards and was overridden. It was right.
  • Pencil board: 0 of 7 numerals and 0 of 8 captions transferred, and the delivery was fully filmic, candlelit stone and fabric weight, not plastic. The plate supplied the surfaces the drawing did not.

Repeated on a second run of the same board: 0 leaks in 30 opportunities across the two runs. The mechanism, stated as narrowly as the evidence allows: a drawn board reads as notation and is discarded, a photoreal board reads as picture and is copied. So the board's job is the plan, and the plate's job is the look.

The user's original instinct, that a drawn board was the right input, was correct throughout. The detour cost a badge burn-in and a run of numeral leaks.

Arrows: a prohibition that lasted one commit

The reference board this skill was modeled on carries numbers, captions and motion arrows, and its delivered video is clean. Reproducing that took five wrong explanations, and the prohibition written after the fourth survived exactly one commit before the fifth attempt replaced it. The sequence is kept in full because the wrong turns are the useful part.

"Arrows always transfer." Drawn from one crisp white vector arrow rendering beside the dancer's hand. Killed by checking the reference board: asset_get confirms both the still and that heavily arrowed board (six arrowed panels, including a thick block arrow) went in as referenceImages, and 16 samples of its delivery show no arrow anywhere.

"Naming arrows in a negative clause causes the leak." Pre-registered, then falsified by deleting "No arrows, symbols or annotation marks of any kind in frame" and changing nothing else. The clause changed how the arrow rendered, from crisp white to dark red, not whether it appeared.

"The beats were not bound to their panels." The original prompt names a panel in every beat and restates each entry pose, and the leaking prompts did neither, which also meant they dropped two of the six elements the skill's own table row 1 asks for. Falsified in the opposite direction: binding produced both of panel 4's arrows where the unbound runs produced one each. Explicit binding raises panel fidelity, so more of the panel transfers, annotations included.

"Reference starvation." The runs passed a character plate as @image1 while the clean original passed a photographic still of the whole scene, so perhaps a plate leaves the model without a template for the frame, pushing it to mine the board for appearance. Appealing, because it also explains the binding result. Dropped without spending a run: identity held across all eight beats of every run and the model built a consistent candlelit courtyard from prose alone, so nothing in those deliveries looks like a model short of information. Seedance 2.5 taking a character sheet was never the question.

At that point the skill said "never draw a motion arrow", resting on measurement with no mechanism. The user then made the observation that resolved it, about the drawing rather than the configuration: our board carried far more detail than the original, and its arrows were far darker.

Run Board Arrows drawn Guides named as guides Concept art Panel 4 Panel 7
A heavy, dark arrows 5 panels no, prohibition only no 1 arrow both
B heavy, dark arrows 5 panels no no 1 arrow clean
C heavy, dark arrows 5 panels no no both both
D light, soft pale 5 panels, same spot yes 3 key frames clean clean

Arrow placement was held identical across all four runs, so panels 4 and 7 are directly comparable. Panel 4 went from 3 of 3 leaking to clean, and run D swept 48 of 48 frames with nothing on screen.

So the rule is not about arrows at all. It is about how heavily the board is drawn: a board drawn as a competing picture is treated as one, and its markings render as objects. Drawn light, the same markings in the same places transfer nothing, which means the annotated board a human wants to review is the same board the model gets, and the two-board workaround is unnecessary.

Run D is a deliberate bundle of three changes, accepted as such rather than spending more runs on decomposition: the light board, the guide declaration, and the concept art. The cause is undetermined among them, and the cheapest decomposition if it ever matters is to drop the concept art and keep the other two, since concept art is the most expensive of the three to mandate. Two of the three earn their place on other grounds anyway: run D is the best-looking delivery of the session, its courtyard consistent with the key frames rather than reinvented.

The prompt wording is the part that would not survive paraphrase, so it moved to references/video-prompt.md verbatim rather than being described. The load-bearing discovery inside it is that a prohibition failed three times where a definition worked: "the storyboard's frame borders, panel numbers, caption text and motion arrows are planning guides drawn on paper by the director. They describe the shot, they are not objects in the world."

Verification has to sweep, not sample

Run B's eight-beat check sampled panel 4 at 10.5s and came back clean. The arrow appears at 11.0s. Only a two-frames-a-second sweep of the whole clip caught it, and without that sweep this section would have recorded a false result. A leaked marking can fade in part-way through a shot, so one sample per shot is not a check. That is now a rule in the skill rather than a lesson in this file.

Panel numbers: a non-problem once the board is pencil

This question absorbed three rounds and turned out to be downstream of the register. An early run burned a white panel-number badge into the top-left corner of a 20-second clip, surviving an explicit "no panel numbers" clause, which read as proof that numbering must sit outside the frame. Then a controlled test had neither badge-inside board leak, which read as prominence rather than placement. Then a photoreal board leaked its numeral into 6 of 8 shots despite the negative clause.

The resolution: numbering leaks from photoreal boards and not from pencil boards, at 0 of 14 across two runs. On the pencil board the skill now prescribes, numbering is safe in frame or under it, and the corner check stays only as cheap insurance. What survives from the whole detour is the smaller lesson, which did keep proving true: never trust a negative clause to remove what you drew.

One plate per character, not a combined sheet

Seedance 2.5 accepts up to 30 referenceImages and the prompt binds them by index, so @image1 can be one character and @image2 another. A combined turnaround gives each character an eighth of a canvas and leaves the model to work out which figure the prompt means. Per-character plates are unambiguous and full resolution. The earlier grouped sheet was habit, not a constraint.

The plate is load-bearing at video time, not just upstream

Recorded here in its original form because it was wrong and the correction matters. The observation was real: a photoreal board carried identity with no character plate in the video call, matching the best plate-bearing run, which suggested the plate's only job was keeping the cast consistent while the board was drawn.

That conclusion does not survive the register reversal. A photoreal board can carry identity alone because it is photographic reference, and it is exactly that property that burns its numbering into the delivery. A pencil board carries no surfaces, so on the board the skill now prescribes the plate supplies identity and material to the video run and dropping it is not an option. The plate does both jobs, upstream and at video time, in both lanes.

Cinematic labels, not action verbs alone

The first fight boards read as twelve pictures rather than coverage. Labeling every panel with number, shot size, angle, lens or camera move, then three action verbs, and arranging the panels as real coverage (master first, hold the axis, climb the size ladder, punctuate with inserts and reactions) produced boards and videos that read as filmed sequences. The vocabulary itself is standard cinematography that a model already knows, so SKILL.md spends its words on the instruction and the coverage rules rather than on a glossary.

Seedance 2.5, discovered but not trusted to rank first

search with query="seedance" returned 2.5 last, at relevance score 0, while 2.0 ranked first with a 15-second duration cap that cannot deliver a 24-second sequence. So the skill tells the agent to scan every hit for the newest non-deprecated generation instead of taking the first, and says why 2.5 is the target: the largest reference count in the family and the best identity hold.

An approval gate before any video run

A board costs a fraction of a video run, so the skill stops for approval on the script, the plates and the numbered board, and invites a reshoot by panel number. Re-running one panel is a single board call with that clause changed and the approved board passed as a reference.

Scripted run versus chained lane

A single scripted run does not deliver a cut per scripted timecode. Against eleven scripted handoffs, detected hard cuts were 0, 2, 2 and 6 across runs: the model renders most handoffs as camera moves. That satisfies continuity, which is the point, but it is not editorial control. Twelve discrete shots require the chained lane.

In the chained lane the pose chain protects motion and nothing else. Boundary stills are independent generations, so costume detail drifts between them (a mask, a helmet crest, a metal finish) and every drift lands on a cut. One clean-room run also mirrored two of its seven stills, which would have asked the fighters to swap sides mid-shot. Hence: pin screen position as well as pose, hold the framing, and review the stills as a set before spending a video run.

Why the chained lane lives in a reference file

Body words load on every trigger. After the fixes the body reached the point where the next lesson would break the 1400-word hard cap in force at the time, and the chained lane is per-mode detail that only a chained run needs (four of five live runs used the scripted lane). It moved to references/chained-lane.md; the lane choice, the mutual-exclusion trap and the cost model stayed in the body.

What the chained-lane validation added

A clean-room agent was given a 40-second knife duel that had to open on an exact pose, which forces the chained lane, with only the installed skill as documentation. It picked the lane from the one sentence about reference mode anchoring frame one, followed the link to the reference, applied all four disciplines, and verified every join for free from asset_get. Frame one was the specified locked-blades pose and all three joins were the same pose either side of the cut. Four defects came out of it:

  • The board and the image budget could contradict each other. Two plates, a board and five stills hit an eight-image ceiling exactly, leaving nothing to re-render a drifted still, which is the dominant failure in this lane. The reference now ranks the board below a reserved repair slot and says why: the board is never passed to the video model here.
  • No plate or board model was named at runtime. The only named one lived in this file, which the agent correctly discounted as maintainer notes. SKILL.md now carries a hedged authoring-time example alongside the selection criteria.
  • A height like 1080 can miss the image model's step, failing as an opaque internal error. Folded into the existing canvas sentence.
  • A shot can be refused on its generated audio, not its picture. generateAudio: false clears it. Covered in the reference, with the instruction not to leave one shot silent while others carry sound.

The coherence gate, and why the quality gate alone is not it

Two boards reached a video run carrying frames that break physical sense: an extreme close-up with four gauntlets for two fighters, an unattached glove and a hilt guard floating with no blade through it; and a low-angle wheel shot whose car had two different wheels, only one whitewall, no wheel arch, and a toy-proportioned body. Neither survives a viewer's first glance, and both cost a full video run.

Three measurements shaped the gate that now exists:

  • A board-level verdict hides panel defects. All three boards scored 88 and pass at high sensitivity while carrying those frames. Twelve panels average their defects away.
  • Scoring the panel alone does not fix that either. The broken-car panel, scored in isolation, came back 92 and pass, and the report praised the "chrome rims" that were the defect. The gate detects artifacts; it has never seen the plate, so it cannot know the car should wear matching whitewalls in proper arches.
  • The score is a weak signal for a repair. The corrected wheel panel also scored 92. What changed was the flaw list, from praising the rims to naming a taillight housing. Judge a repair on the differences checklist and the new reasons, not on the number.

So the gate is two passes per panel, and a panel must clear both: asset_quality_gate_run for artifacts (it did find melted finger joints, warped speedometer numerals and doubled blade edges that the eye skipped), and a spot-the-difference against the plate for anything only wrong beside the reference. What the two passes found together, across three boards: samurai 4 and 10, cars 2, 3, 8 and 11, dancer 3, 7 and 8.

Repair is by replacement, not by re-rolling the board: slice with model_scenario-image-slicer, regenerate only the failing panel with the plates as references and the correction stated positively, then recompose with model_scenario-compose-image so approved panels are pasted rather than regenerated. Measured cost of the loop: 1 CU to slice, 1 CU per panel scored, 47 CU per repaired panel, 2 CU to recompose, against 2730 CU for the video run it protects.

One honest side effect: replacing a whole cell replaces its caption too, so a repaired panel's label renders at a slightly different size from its neighbors. Compositing only the art region over the original cell would avoid it, at the cost of locating that region per board.

The full-flow validation, three sequences from scratch

Three new sequences were built end to end through all nine steps: a flamenco courtyard, a staff duel on a temple terrace, and a 1970s night rally. New cast, new compositions, 8 panels each at 3 seconds, 24 panels generated individually, all 24 gated, 8 repaired, 3 boards composed, 3 videos delivered.

What it proved and changed:

  • Per-panel gating localizes what board scoring hid. Six panels warned or scored low across the three sequences, and every finding was specific: melted fingers on the floreo, warped rally dials, a staff broken into two misaligned segments, a driver's hand fused to the wheel. All had passed my own eye first.
  • The differences pass caught what the gate never mentions. In one rally panel the yellow car sat ahead of the white, contradicting the brief. Every score on that panel was fine.
  • An intentional annotation reads as a defect. The gate flagged the small in-frame panel numeral as "an unwanted watermark" on every single panel, depressing scores by a design decision. Worth knowing before treating per-panel scores as absolute.
  • A composed board must stay inside a 0.4 to 2.5 aspect ratio. Two 1080p runs failed outright on a four-by-two grid of 16:9 panels (3.56). Three-by-three (1.78) passed. Only the job record's hint names the range.
  • Some panel flaws do not reach the video. The staff sequence was the worst-scoring board of the three, flagged five times for hands merging into wood and staffs bending, and it still delivered a clean 24 seconds with rigid staffs and four distinct hands at the bind. Prop geometry gets re-derived; burned-in graphics and plan errors do not. That distinction now sits in the reference, because it decides how many repair rounds a flaw class deserves.

Also measured: the actual spend for the whole PR came to about 26k CU, against a running estimate of 41k that had been accumulated from per-call arithmetic rather than read from usage. Read the meter.

What the plan-only validation found

A clean-room agent, given only the installed skill and a 24-second eight-shot fight brief, produced an 85-call plan and followed every rule this PR added without prompting: light board, diegetic audio with no instrument named, the 2 fps sweep, the 0.4 to 2.5 board ratio (noting correctly that it only binds when the board is actually passed), per-panel gating, collection before generation, jobs_wait with pending_job_ids, discovery instead of an asserted model id, and aspectRatio omitted in first/last-frame mode. It flagged eight uncertainties rather than guessing.

It also found that the brief was impossible, which no one on this side had noticed. SKILL.md routes discrete shots to the chained lane, but duration accepts only -1 or 4 to 30, so eight chained shots occupy at least 32 seconds while the scripted lane will not honor eight cuts in 24. The worked example compounded it by scripting twelve shots across 24 seconds, two seconds each. Six defects came out of it, all fixed:

  • The duration floor was never stated, so the lane's cost arithmetic invited impossible plans. Now in the body and spelled out with the numbers in the chained-lane reference.
  • The size ladder and hold-the-framing contradicted each other. Both sides of a chained cut are the same frame, so shot size cannot change at a join. The agent called this the hardest decision in the task and resolved it by inference. Now reconciled explicitly.
  • video-prompt.md read as lane-neutral while two of its seven sections only apply to the scripted lane, and the chained lane had no prompt shape at all. Now labeled, with the five sections that carry over named.
  • Step 8's key frames had no home in the chained lane, which has no referenceImages slot. The boundary stills are the key frames; said so.
  • The board was the approval artifact in one file and "the first thing to drop" in another, which bit immediately because the brief asked for storyboard sign-off.
  • No step elicited the creative brief, though the plate is load-bearing everywhere after it.

Two things were deliberately not filed as defects. The agent named numImages where the real parameter is numOutputs, but the skill never discusses image-model parameters and the plan had already scheduled the schema read that would have caught it. And all six named siblings were absent from the clean room, which is the known install-resolution gap: the invitation sentence fired correctly and the agent flagged the affected phase instead of inventing a model id.

The lesson for this file: five paid video runs found the register and arrow rules, and one free plan-only run found a correctness bug that would have sent a user down an impossible path. Run the cheap test first.

Felt cuts are not what either lane delivers

Two clean-room agents, given different briefs, both asked for cuts a viewer could feel, both chose the chained lane because SKILL.md routed discrete shots there, and both then extrapolated the same untested workaround: render each boundary twice, one still per framing, and treat the pair as a match cut. Neither had documentation for it. Both invented it from the same sentence, which said a size change at a join "would need two different stills of one pose" as a reason it could not work. A sentence that reliably produces the inference it was arguing against is a defect whatever it intended.

The measurements say neither lane gives editorially distinct cuts. The scripted lane converted eleven scripted handoffs into 0, 2, 2 and 6 detected hard cuts across four runs, rendering the rest as camera moves. The chained lane makes both sides of a join the same frame, so the coverage size cannot differ across it and the join reads as continuous motion by construction.

So the skill now says what it delivers in the Overview rather than leaving it to be derived after a lane is chosen, stops describing the paired-stills mechanism, and routes the want to where it actually works: deliver the continuous take and cut it at your own points with scenario-video-editing. The momentum is real because it was one take, the cuts are real because an editor made them, the cut points are exact and free to move, and nothing needs re-rendering.

The paired-stills idea was deliberately not priced as an option. It is unmeasured, it doubles the still budget, it cannot be checked without a paid video run, and recommending an untested technique inside a skill whose whole purpose is to stop an agent guessing would undercut the rest of the file. Two independent agents converging on it is a reason to close the inference off, not to bless it.

The description was left alone on purpose. Someone who wants six felt cuts should still trigger this skill, because it now carries the answer for them; narrowing the keywords would hide the guidance from exactly the reader who needs it.

The six plan-only defects, and one caught by verification

A third clean-room run on a scripted-lane brief (the first two both chose the chained lane, so the scripted half had never been read cold) came back a pass with six non-blocking items. All six are fixed: the compose canvas fields now say to read them off model_schema_get, generateAudio's default-on is stated so sound needs no flag, the audio check is named as eyes and ears with the warning that a useless run looks like a good one, the grid guidance generalizes, the caps are read before the script is written, and the deliverable statement moved to the Overview's third sentence.

That run also confirmed the earlier fixes in a way a repeat brief could not have: the duration floor was used in reverse, to disqualify the chained lane at "4 s floor x 6 shots = 24 s > 20 s", and the audio lane scoping held with generateAudio: true in a scripted prompt and no confusion with the chained lane's picture-only rule.

The fix for the grid item was wrong on the first attempt, and how it was caught is the part worth keeping. Replacing two correct examples with a general rule produced "three columns is the most that stays inside the range", which is false: four by three is 2.37 and sits inside it. Worse, the rule was unsound in both directions, since "at most three columns" permits three by two at 2.67, which the same sentence names as a failure, and it forbids four by three, the natural layout for this skill's own 12-panel worked example. A five-panel board obeying it lands on 3x2 (2.67) or 1x5 (0.356) and fails either way.

Nineteen candidate findings came out of four verification passes over the diff, run with distinct lenses: lost content, internal contradiction, whether each fix closes its defect, and mechanical compliance. Seventeen were rejected under adversarial re-check, including two that attacked the same grid paragraph for having wrong numbers, which it did not. The two that survived were the two that correctly identified the rule rather than the arithmetic as the error. Both proposed stating the formula, which is what the file now does.

The lesson is narrower than "verify more". Replacing correct-but-narrow examples with a general rule is the single riskiest edit in a reference file, because a confidently stated wrong rule is worse than the vague text it replaced, and it reads as more authoritative. Two attacks on the canvas-fields fix were also rejected here on solid evidence, one verifier checking the live schema and another the sibling scenario-video-assembly skill, both confirming canvasWidth and canvasHeight are real. A harness that rejects seventeen of nineteen findings is doing its job in both directions.

Open questions

  • How reliably a single-panel reshoot holds the other panels. Verified once: with the approved board passed as a third reference and only panel 9's clause changed, panel 9 was corrected and the other eleven panels came back unchanged, labels included. One trial is not a guarantee.
  • Whether the register finding generalizes to non-photoreal deliveries: an animation-style board for an animation-style delivery should follow the same logic, untested.
  • Which of run D's three changes suppresses the markings. Undetermined by design. One run separates the concept art from the other two.
  • Where the line falls between a board light enough to stay a plan and one heavy enough to be copied. Only the two extremes have been measured.

Skill manifest

Scenario Seedance Storyboard

Overview

Prompted shot by shot, generated movement falls apart: limbs teleport, feet slide, and every cut resets the performance. So storyboard instead of prompting harder. What this delivers is continuous motion through the handoffs, not editorially distinct cuts: for cuts a viewer can feel, cut the delivered clip yourself with scenario-video-editing. Write a timecoded shot script, draw a character sheet and a numbered panel per shot, and hold one rule: every shot ends in the pose the next one starts from. Pinned boundaries leave nothing to reset, so the cuts play as one performance.

Connection and the core loop: the scenario skill; the Seedance parameter contract, conditioning traps, and sound lanes: the scenario-seedance skill; identity across stills and a reusable character sheet: the scenario-consistency and scenario-identity-library skills; a board or comic page that is itself the deliverable: the scenario-storyboards skill; splitting and rejoining shots: the scenario-video-editing and scenario-video-assembly skills. If a sibling skill named here is missing from your available skills, ask the user to install it (npx skills add scenario-labs/skills --skill <name>); unattended, proceed from tool schemas and flag the gap.

Quick reference

Step What How
1. Script timecoded list, cast and setting agreed first per shot: number, size, angle, lens or move, action verbs, entry and exit poses
2. Plates one image per performer who must stay recognizable, several angles; extras generic and unnamed image model via recommend; one clean still of a real performer also works
3. Briefs one line per panel, coverage not pictures master first, hold the axis, climb the size ladder, punctuate
4. Panels one model_run per panel plates as references, light pencil line on bare paper, each at delivery ratio
5. Gate two passes per panel, then repair one panel artifacts and differences, per board-craft
6. Assemble the approved panels into the board model_scenario-compose-image at explicit coordinates
7. Approve script, plates, board shown to the user reshoot by panel number; unattended, record and continue
8. Frames two or three photoreal key frames same plates, delivery ratio; they set the delivered look
9. Video one scripted run, or chained runs Seedance model_run, one of the two lanes below
10. Check the delivery is clean and carries its track sample every half second, not only the cuts, and match each cut to its panel

Label each panel as a shot list does: number, shot size, angle, lens or camera move, then three action verbs. Arrange them as coverage, not twelve pictures: open on a master that sets the geography, hold one side of the axis so screen direction never flips, climb the size ladder, and punctuate with an insert or a reaction. Adjacent shots share an edge by construction: shot 3's exit is shot 4's entry.

Draw the board light: thin pale line on bare paper, the setting in two or three quick lines, no rendered environment. A board drawn as a competing picture is treated as one, and its markings render into the delivery as objects, which no prompt clause can clean. Drawn light, the same markings transfer nothing, so numbers, captions and arrows can all stay on the board a human reviews. What carries that is prompt wording, not drawing: declare the marks as the director's planning guides rather than prohibiting them, and pass the key frames as concept art so appearance has a photographic source. Both are in video-prompt.md.

Panels are generated one at a time, so one bad panel costs one panel, and gated before any video run on two passes: an AI-quality score for artifacts, and a spot-the-difference against the plate. A board-level verdict is not the bar: panels average defects away.

File as you go: one collection per sequence, created before the first generation, holding plates, panels, repairs, board and video (board-craft).

Stop for approval before the first video run, with the key frames shown alongside the script, plates and board, and invite a reshoot by panel number; unattended, record the assumption and continue.

Two lanes

One scripted run. When the sequence fits one job's duration cap (30 seconds on 2.5 at authoring time), pass the plates, board and key frames as referenceImages and build the prompt to the seven-section shape in video-prompt.md. One generation carries the internal cuts: the plates hold identity, the pose chain holds continuity. Name aspectRatio; it defaults to adaptive here, so a portrait board hands back a portrait video. Reference mode anchors frame one to the base state of the reference world (see scenario-seedance), so a sequence that must open on an exact pose belongs in the chained lane.

Chained per-shot runs. Past the duration cap, when each shot needs its own control, or when the sequence must open on an exact pose: render each boundary pose as a still, then run shot N with image = still N-1 and lastFrameImage = still N, so adjacent shots share a frame both sides agree on. This excludes referenceImages, so the stills are a shot's only identity, and N shots cost N+1 stills and N runs. Each run also has a duration floor (4 whole seconds on 2.5 at authoring time), so N shots cannot total less than N times it, and more cuts than that means fewer shots or more seconds. The disciplines and the repair path are in references/chained-lane.md.

Worked example: a 12-shot dance in one run

  1. Write the script: 12 shots over 24 seconds, edge poses named, every exit matching the next entry. Show it to the user first; it is the cheapest place to be wrong; unattended, write it down and continue.
  2. Generate one plate per character, then the 12 panels, then two or three photoreal key frames from the same plates. Upload anything local with upload_asset (see the scenario skill). Show the board and the key frames to the user before going further.
  3. search with target="models", query="seedance", public=true. Hits rank by relevance, not generation, so scan them all for the newest non-deprecated member rather than the first: at authoring time model_bytedance-seedance-2-5 (re-discover each session), which takes the most references and holds identity best. Then model_schema_get for caps.
  4. model_run with dry_run=true and parameters={"prompt": "<the timecoded script>", "referenceImages": ["asset_dancer", "asset_board", "asset_key1", "asset_key2"], "duration": 24, "resolution": "1080p", "aspectRatio": "16:9"}; re-estimate after any change.
  5. Re-run with wait=false, then jobs_wait, re-called with pending_job_ids on timeout. A timeout is not a failure and never justifies a second model_run.
  6. Step through the cuts: both sides must agree in pose and match the panel. Then sweep the whole clip at two frames a second, because a leaked board marking can fade in part-way through a shot, so one sample per shot reports a false clean. asset_display returns a link for video, not frames, so pull them locally or with model_scenario-video-to-image-seq (a fixed id: Scenario's single deterministic frame-extraction tool, so discovery would only re-derive it). Expect fewer cuts than scripted: most handoffs render as camera moves, so cut the delivered take at the twelve scripted points.

Common mistakes

  • Prompting choreography as adjectives ("dances energetically"): timecoded verbs and edge poses survive generation; mood words do not.
  • Naming the pose but not the position: in a two-character scene a mirrored boundary still breaks the cut as hard as a wrong limb.
  • Scripting a character who leaves frame and returns, or a change made off camera, inside one run: whatever leaves frame is gone for the rest of that run, and no boundary check can catch what happened out of shot. Land departures, returns and state changes on a chained boundary still (chained-lane).
  • Expecting a scripted run to open on a prompt-described pose: reference mode anchors frame one to the base state; exact openings are the chained lane's job.
  • Delivering silence by default: ask for diegetic sound by naming its sources, and name no instrument, genre, or exclusion such as "no music", which is what triggers an audio refusal. generateAudio: false is the fallback, not the default.
  • A script past the prompt's max_length, or timecodes past the duration cap: read both off model_schema_get before writing the script, since step 1 comes before discovery; an overrun is a 400, never a trim. Then send the run's scripted length as duration: its default is Auto (-1), which the schema defines only against a reference clip, so a timecoded script sent without it runs for an unstated length.
  • Getting the ratios wrong: each panel must carry the delivery ratio, since a reframe moves the poses the chain depends on, and the composed board must land inside a 0.4 to 2.5 aspect ratio or Seedance rejects it as a reference and the run fails.
Files (skills)
  • references
    • board-craft.md 9.9 KB
      # Board craft and the coherence gate
      
      Drawing the board, then proving it is fit to spend a video run on. Read this before generating panels.
      
      ## Drawing the panels
      
      Draw them light. Thin pale pencil line, bare white paper, the setting indicated by two or three quick
      lines and no more, no heavy shading and no rendered environment. This rule binds wherever the board is
      passed to the video model, which is the scripted lane; a chained run never shows it the board, so there
      the register is insurance for the human reviewer rather than the mechanism. The board is a plan, and a board drawn
      as a competing picture gets treated as one.
      
      That is the whole finding, arrived at the expensive way. A photoreal board leaked its panel numeral
      into 6 of 8 delivered shots with the prompt held byte-identical, while a pencil board leaked none, and
      the pencil delivery was fully filmic because the plates and key frames supplied the surfaces. But a
      _heavily drawn_ pencil board, full environment in every panel and dark confident arrows, still rendered
      its motion arrows into the delivery as real arrows floating in shot: three runs, and no prompt clause
      suppressed one. Redrawn light, with the same arrows in the same places, the same board delivered 48 of
      48 frames clean.
      
      So markings are safe on a light board, and that includes motion arrows, which means the annotated board
      a human actually wants to review is the same board the model gets. Draw arrows broad, soft and pale,
      feathered rather than solid, so they read as gestural annotation. Numbering and captions have never
      transferred from any pencil board: 0 leaks in 93 opportunities across four runs.
      
      Two things carry that result and both belong in the prompt, not the drawing. Declare the marks as
      guides rather than prohibiting them, and pass photoreal key frames as concept art so the model has a
      photographic source for appearance instead of the drawing. Both are in
      [video-prompt.md](video-prompt.md), which is worth reading before the run rather than after it.
      
      Give each character its own plate rather than a combined sheet. Seedance 2.5 takes up to 30
      `referenceImages` and the prompt binds them by index, so `@image1` is fighter A and `@image2` is
      fighter B, each at full canvas and unambiguous. A pencil board carries no surfaces of its own, so in
      the scripted lane the plates do double duty: holding the cast steady while the board is drawn, then
      supplying identity and material to the video run.
      
      Pick the plate and board model for legible in-image text, strict grid adherence, and `referenceImages`
      input so panels lock to the plates; shortlist with `recommend`, stating those three needs in the
      user's own words (at authoring time `model_openai-gpt-image-2` did all three), and since `recommend`
      can answer this step with style LoRAs, hold each hit to all three before picking.
      A board is a large canvas: it can exceed an unstated total-pixel ceiling even inside the schema's
      per-axis limits, and a height like 1080 can miss the schema's `step`, so read the error and adjust.
      
      Generate the panels as individual images rather than one grid, then compose the grid. One bad panel
      then costs one panel instead of the board, which is the same reason `scenario-storyboards` runs one
      `model_run` per panel.
      
      ## Filing, before anything is generated
      
      A sequence produces dozens of assets: a plate per character, a panel per shot, a repair per failure, a
      composed board, then the video. Loose in a project they are unrecoverable a week later, and the panel
      you need to re-repair is indistinguishable from the one it replaced.
      
      So create the collection first and add each artifact as it lands, rather than tidying up at the end.
      The collection tools are catalog-only, so route them through `scenario_tools_search` once for the
      schemas and then `scenario_tool_execute_write`:
      
      - `collection_create` takes a `name` only, there is no description field, so put the sequence and the
        date in the name.
      - `collection_add_assets` takes `collection_id` and an `asset_ids` array; batch each stage's output in
        one call.
      - `collection_update` accepts a `thumbnail` asset id: point it at the composed board so the collection
        is recognizable in a list.
      
      The payoff is retrieval: `search` with `target="assets"` accepts `filters.collection_ids`, so the whole
      sequence comes back in one call, and a repaired panel sits next to the panel it replaced.
      
      ## Why the gate takes two passes
      
      A board-level verdict hides panel defects. Three 12-panel boards each scored 88 and `pass` while one
      of them carried a physically impossible frame: four gauntlets for two fighters, an unattached glove,
      and a hilt guard floating with no blade through it. Twelve panels average their defects away.
      
      Scoring the offending panel alone does not fix that by itself. The isolated broken-car panel came back
      at 92 and `pass`, and the report praised the "chrome rims" that were the defect: two different wheels,
      one without the whitewall its plate specifies, neither sitting in a wheel arch. The AI-quality gate
      detects artifacts, not disagreements with a reference it has never seen.
      
      So run both passes on every panel, and require both:
      
      1. **Artifacts.** `asset_quality_gate_run` per panel (see `scenario-quality-gate`): 1 CU per new
         analysis, image assets only, an Enterprise add-on, so degrade to `asset_analyze` when it is not
         entitled. It reliably finds melted finger joints, warped dial numerals, and doubled blade edges.
      2. **Differences.** Compare the panel with its plate, item by item. The baseline enumeration is the
         checklist, so read it as a spot-the-difference:
         - **Count**: hands, fingers per hand, arms, blades, wheels, headlights. Every one attached to a
           single body, and every hand to a single arm.
         - **Part to whole**: a wheel sits inside an arch, a hilt guard sits on its own blade, wheelbase and
           door length match the plate's silhouette, a reflection sits under the limb that casts it.
         - **Livery and costume**: every named detail, the whitewalls, the gold edging, the chain.
         - **Screen side**: the character stands where the script pinned them.
      
      A panel fails if either pass fails. Do not average, and do not accept a board-level `pass` as the bar.
      
      The score is a weak signal for whether a repair worked. The broken wheel panel and its corrected
      replacement both scored 92: what changed was the flaw list, from praising the mismatched rims to
      naming a taillight housing. So judge a repair on the differences checklist and on the new `reasons`,
      never on the number moving.
      
      ## Repairing one panel without re-rolling the others
      
      1. If the board is already a single image, slice it: `model_scenario-image-slicer` with
         `xSubdivisions` and `ySubdivisions` (up to 6 each), 1 CU, returning the cells in reading order.
      2. Regenerate only the failing panel, with the plates as references and the correction stated as a
         positive requirement rather than a prohibition. "Both wheels the same rim design with whitewall
         tires, each inside a wheel arch, the wheelbase of a full-size hardtop" fixes what "not deformed"
         does not. Keep the panel's caption text in the prompt so the replacement carries its own label.
      3. Recompose with `model_scenario-compose-image` (Image Studio): one `layers` entry per panel with
         explicit `x`, `y`, `width` and `height`, `canvasMode: "custom"`, and the board's own canvas size.
         Read the canvas and per-layer field names off `model_schema_get` rather than assuming them: two
         clean-room runs guessed `canvasWidth` and `canvasHeight` from this sentence when it only described
         the size in words.
         Approved panels are pasted, not regenerated, so they survive unchanged.
      
         Keep the composed board's own aspect ratio between 0.4 and 2.5. Seedance rejects a reference image
         outside that range, and the run fails on an opaque internal error whose `hint` is the only place the
         range appears. A grid of 16:9 panels reaches it fast, and what decides it is columns against
         rows rather than either alone: the board's ratio is 16 times the columns over 9 times the rows. Four
         by two is 3.56 and fails, while three by three (1.78) and four by three (2.37) both pass, and a
         six-panel board wants two by three (1.19) rather than three by two (2.67). Compute that ratio for
         the grid you intend before composing, since it holds while the columns stay at most about 1.4 times
         the rows and the rows at most about four times the columns. Choose the grid for the ratio, not for
         the panel count.
      
      4. Re-gate the replaced panel before spending the video run.
      
      The economics are the argument: a repaired panel cost 47 CU against the 2730 CU video run it protects,
      and a board that reaches the video model with a broken panel spends the whole run on a sequence that
      cannot be delivered.
      
      ## What transfers from a panel to the video, and what does not
      
      Not every panel flaw survives into the render, so know which classes to spend a repair on.
      
      **Transfers.** Marks the video model reads as depicted objects rather than notation, which is a
      property of how heavily the board is drawn rather than of the mark: a numbered badge on a photoreal
      board burned into all 20 seconds of a delivered clip, and dark arrows on a heavy pencil board rendered
      as arrows in shot, while the same marks on a light board transfer nothing. So does anything that is a
      plan error rather than a rendering error, because the video obeys the plan: a mismatched livery, a
      character on the wrong side of frame, a shot order that contradicts the script.
      
      **Often does not.** Prop and limb geometry that the video model re-derives from scratch. A staff duel
      whose panels were flagged five times over for hands merging into wood and staffs bending or breaking
      still delivered a clean 24 seconds: rigid staffs, four distinct hands at the bind. The panels were the
      worst of three sequences and the video was not.
      
      So the gate is worth its cost for the classes that transfer and for proving the plan before a video
      run, and a panel whose only defect is local prop geometry is worth one repair attempt, not three.
      
    • chained-lane.md 5.7 KB
      # Chained per-shot runs
      
      Per-shot detail for the second lane in `SKILL.md`. Read it when the sequence runs past one job's
      duration cap, when each shot needs its own control, or when the sequence must open on an exact pose.
      
      ## The chain
      
      Draw the board first: it is the cheap place to catch a broken chain, and it stays the artifact the
      user approves, exactly as in the scripted lane. What differs here is that the video model never sees
      it, so its register and its markings cannot reach the delivery and the set review below covers the
      same ground the board would. That makes the board the one item a user can knowingly trade away for
      another image slot when the budget is tight, which is their call to make and not a default. Keep one
      slot in reserve either way, for re-rendering a drifted still. Then render each boundary pose as a still and run each shot in
      first and last frame mode, so shot N takes `image` = boundary still N-1 and `lastFrameImage` = boundary
      still N. Adjacent shots share the still, so every cut lands on a frame both sides already agree on.
      N shots cost N+1 stills and N runs, plus one plate per character.
      
      A departure, a return or a change made off camera lands on a boundary still: the still after the exit shows the frame without the character, and the still after the return shows them back with the change visible. The shot that runs into that still writes its TIMELINE exit pose as position and posture (where she stands, hands at her chest) and does not name the changed detail, which `lastFrameImage` carries; the next shot, whose `image` shows it, is the first prompt that names it; when the return is the last shot, nothing names it and the still carries it alone.
      
      Count the seconds before the stills. Each run carries its own duration floor, 4 seconds on 2.5 at
      authoring time, and takes whole seconds only, so N shots occupy at least N times that floor, a sequence
      cannot be shorter, and any total has to be reachable as a sum of N whole numbers at or above it. Eight
      discrete shots is 32 seconds at the floor, not 24, and twelve is 48. When the brief asks for more cuts
      than the arithmetic allows, the choice is fewer shots, a longer sequence, or the scripted lane's
      camera-move handoffs instead of cuts. Read the floor off `model_schema_get` rather than trusting this
      number, and settle it with the user before rendering nine stills for a sequence that cannot exist.
      
      This mode excludes `referenceImages` (mutually exclusive with `image`), so the stills are the only
      identity a shot gets. `aspectRatio` is ignored here too: the output adapts to the first frame, so the
      stills set the delivered shape.
      
      ## Rendering the boundary stills
      
      The sheet makes each still plausible on its own, not identical to the next. Three disciplines close
      that gap, and all three are cheaper than a re-run:
      
      - **One baseline prompt, one varying clause.** Keep the prompt byte-identical across the set and
        change only the pose clause (see `scenario-consistency`).
      - **Pin screen position, not just pose.** A named pose is not a named position: say which side of
        frame each character holds in every still. A mirrored still asks two fighters to swap sides
        mid-shot, which breaks the cut as hard as a wrong limb.
      - **Hold the framing.** A shot whose camera travels cannot land on a boundary drawn from the anchor
        framing. Pick continuity over camera variety, or move the camera inside a single shot only.
      - **Shot size cannot change at a join.** This lane and the size ladder in `SKILL.md` pull against each
        other, and the mechanism decides it: both sides of a chained cut are the same frame, so the coverage
        size on either side of it is the same too. Climb the ladder with camera moves inside shots (crane
        down, dolly in, push, pull back), and accept that the joins read as continuous motion rather than as
        visibly distinct coverage. When the brief needs cuts a viewer can feel, deliver the continuous take
        and cut it at those points with `scenario-video-editing`: that route is reliable, and no
        generation-side trick for producing a felt cut at a join has been measured here.
      
      These stills also absorb `SKILL.md` step 8: there is no `referenceImages` slot in this lane to pass
      concept art through, so the boundary stills are the key frames, and they carry the delivered look as
      well as the poses. Render them photoreal at the delivery ratio for that reason.
      
      Then review the whole set together before spending one video run. Costume detail drifts still to
      still, a mask, a helmet crest, a metal finish, and because the stills sit on the boundaries, every
      drift lands on a cut. Regenerate the offending still, not the delivered shot.
      
      ## Verifying the joins
      
      Free, and exact: `asset_get` returns each clip's `firstFrame` and `lastFrame` as their own asset ids,
      so `asset_display` the outgoing `lastFrame` against the incoming `firstFrame`, one pair per join. Both
      must read as the same pose. When a delivered ending beats the drawn one, pass that clip's `lastFrame`
      asset id as the next shot's `image` instead of the drawn still, and rewrite that shot's STARTING STATE
      and its TIMELINE beat's entry pose to what the frame shows rather than what the script planned.
      
      ## When a shot is refused
      
      A per-shot run can be rejected on its generated audio rather than its picture, which reads as a
      content refusal on a fight that is fine to look at. Re-run that shot with `generateAudio: false`. Do
      not leave some shots scored and one silent: lay the master picture-only and score the assembled cut,
      which is the rule anyway.
      
      ## Repairing one shot
      
      Render the shot's two boundary stills, split the master at its timecodes, regenerate the shot between
      them, and rejoin (`scenario-video-editing`, `scenario-video-assembly`). Score once over the assembled
      cut, never per shot: the sound lanes are in `scenario-seedance`.
      
    • video-prompt.md 6.4 KB
      # The video prompt
      
      The prompt that turns an approved board into a delivery, for the scripted lane: one run carrying the
      whole sequence, with the plates, board and key frames passed as `referenceImages`. Seven labeled
      sections, in this order. The wording below is measured, not stylistic: the sections marked load-bearing
      each fixed a failure that cost a full video run to find. Fill in the specifics and keep the structure.
      
      In the chained lane, five of the seven carry over per shot: STARTING STATE, TIMELINE (one beat, not
      eight), CAMERA, MUST REMAIN UNCHANGED and CONSTRAINTS without its audio paragraph. Drop REFERENCE ROLES
      and GUIDES ARE NOT CONTENT.
      That lane passes no `referenceImages` and never shows the model a board, so there are no reference
      roles to assign and no guides to rule out, and the boundary stills carry identity and look instead.
      See [chained-lane.md](chained-lane.md).
      
      ## REFERENCE ROLES
      
      Say what each reference governs and, just as important, what it does not.
      
      > @image1 is the performer reference and controls only the character's identity: face, hair, costume.
      > @image2 is a pencil storyboard, a planning document only: play its eight numbered panels in order,
      > one shot per panel, three seconds each. It controls the order of the shots, the shot size of each,
      > and where bodies sit in frame, and nothing else. @image3, @image4 and @image5 are concept art:
      > photographic key frames that define the look of the finished film, its lighting, its color, its film
      > grain and its texture. Match the concept art for rendering and the storyboard for staging. Every
      > delivered frame is a single full-bleed photographic frame in the register of the concept art.
      
      Two or three photoreal key frames earn their cost twice: they set the delivered look, and they give
      the model a photographic source for appearance so it does not mine the drawing for one. Generate them
      from the same plates before the run, at the delivery ratio, and name them in the prompt as concept art.
      
      ## GUIDES ARE NOT CONTENT
      
      Load-bearing. A prohibition does not work here; a definition does. Three runs carrying "no arrows,
      symbols or annotation marks of any kind in frame" still rendered a drawn arrow into the delivery, and
      deleting that clause changed only the arrow's color. What worked was telling the model what the marks
      are:
      
      > The storyboard's frame borders, panel numbers, caption text and motion arrows are planning guides
      > drawn on paper by the director. They describe the shot, they are not objects in the world. None of
      > them exists in the scene and none of them appears in any delivered frame. No text, no captions, no
      > logos, no numbers, no arrows, no symbols, no storyboard panels, borders or grid visible in frame, no
      > split screen, no pencil or paper texture anywhere.
      
      Keep both halves. The first sentence does the work the list never did on its own.
      
      ## STARTING STATE
      
      One sentence of place and one of the opening pose, so beat 1 has an entry state to begin from.
      
      ## TIMELINE
      
      Load-bearing, and the section the shot list feeds directly. One entry per beat, and every entry
      carries all five of: the timecode, `Panel N`, the shot size with angle and lens or move, the entry
      pose, and the exit pose.
      
      > TIMELINE, one shot per panel, each beat beginning in the pose the previous beat ended. 0-3s Panel 1,
      > EWS high angle 24mm static: begins chin down, arms low, hands closed. She holds still, only the
      > candle flames drift. Ends chin down, arms low. 3-6s Panel 2, FS eye level 35mm slow dolly in: begins
      > chin down, arms low. Weight settles onto the right foot, then both arms sweep up and the spine
      > arches, and the ruffled sleeves lag behind the arms and settle a beat after the arms stop. Ends arms
      > crowned overhead, wrists turned out.
      
      Naming the panel raises how faithfully that panel is reproduced, which is why the board must be a
      clean plan: binding the beats to a heavily drawn board pulled more of the drawing through, including
      its arrows.
      
      Write the action as physics, not as adjectives. Name the approach, the contact, the transfer of force,
      and the recovery, and give soft matter its lag: sleeves settling a beat after the arms stop, dust
      thrown up on heel contact and falling back, a train reaching its arc after the pivot has finished.
      Those all rendered correctly from prose alone in every run, which is why motion never needs an arrow.
      
      ## CAMERA
      
      Real rigs only, dolly and tripod, no drift where static is specified, and a shutter to fix the motion
      blur ("consistent with a 1/48 second shutter on 35mm film").
      
      ## MUST REMAIN UNCHANGED
      
      The identity list, restated as invariants: the same performer, costume, and location with its lighting
      in the same places, first frame to last. Add the anatomy count ("two arms, two legs, and five fingers
      on each hand in every frame"), which is cheap and catches the common failure.
      
      ## CONSTRAINTS
      
      Only failures the timeline cannot express: duplicated limbs, feet sliding without weight transfer,
      teleporting between positions, watermarks or timecode, slow motion, speed ramps, freeze frames.
      
      Ask for sound, and be specific about which sound. This paragraph is scripted-lane only: one run means
      one continuous audio bed, so the ask belongs in the prompt. A chained run scores the assembled master
      instead and lays every shot picture-only, per [chained-lane.md](chained-lane.md). A silent delivery is
      a defect in a production cut either way, so `generateAudio: false` is the fallback after a refusal, not
      the default. The parameter defaults on, so sound needs no flag and only silence has to be asked for. What gets a run refused is
      naming an instrument or a genre, which invites the model to synthesize music and can fail the whole job
      on an output-audio copyright violation. So list the sources the scene itself makes, and only those:
      
      > Diegetic sound only: heel taps on the boards, fabric, breath, room tone.
      
      Measured on two runs of the same sequence: that line, then followed by "No music, no score.", delivered a
      clean audio track, while the same line with "a distant guitar" added failed on
      `OutputAudioSensitiveContentDetected`. The exclusion has failed that check on other runs, so leave it out.
      Name the surfaces, the cloth, the breath and the room, never the instrument and never what to omit.
      
      Nothing tool-side confirms the delivered track, so the audio check is eyes and ears: play the file and
      listen for the beats the timeline named. A refusal arrives as a failed job with its own code, but a run
      that succeeds while generating nothing useful arrives looking exactly like a run that worked.
      
  • README.md 26.5 KB
    # How this skill was built
    
    Maintainer notes, not runtime instructions. Every rule in `SKILL.md` below is tied to the live run
    that produced it, so a future edit can check whether the evidence still holds rather than re-arguing
    from taste. All runs used Seedance 2.5 and GPT Image 2 through the Scenario MCP server.
    
    ## Why a separate skill
    
    The pose-chain workflow existed nowhere in the repo: the only trace was one sentence in
    `scenario-seedance-music-video/references/shots.md`, a supporting file of a different skill. It could
    not be folded into `scenario-seedance` either, because that body was already at the top of the house
    word target and the combined text would have blown the hard cap. The triggering conditions also
    differ: the family skill fires on parameter and conditioning questions, this one fires on a symptom
    ("limbs teleport", "motion resets at every cut"). A baseline probe with no skill installed had the
    agent reconstruct the chaining mechanism itself and flag it as guesswork.
    
    ## Decisions and the evidence
    
    ### Pencil panels with photographic plates, not photoreal panels
    
    Reversed twice, and the second reversal is the one that holds. The skill first said pencil, then said
    photoreal on the strength of a 2x2 test, and now says pencil again because that test never contained
    the cell that matters.
    
    The 2x2 compared board style against number placement with the character sheet held constant, and
    concluded photoreal because pencil-plus-render-sheet drifted toward posed action-figure plastic. What
    it never ran cleanly was pencil board plus a _photographic_ plate. That cell was finally measured with
    the prompt held byte-identical and only the register changed:
    
    - Photoreal board: the panel numeral leaked into 6 of 8 delivered shots, despite an explicit negative
      clause naming it. The quality gate had flagged that numeral as "an unwanted watermark" on all 24
      panels of the earlier boards and was overridden. It was right.
    - Pencil board: 0 of 7 numerals and 0 of 8 captions transferred, and the delivery was fully filmic,
      candlelit stone and fabric weight, not plastic. The plate supplied the surfaces the drawing did not.
    
    Repeated on a second run of the same board: 0 leaks in 30 opportunities across the two runs. The
    mechanism, stated as narrowly as the evidence allows: a drawn board reads as notation and is
    discarded, a photoreal board reads as picture and is copied. So the board's job is the plan, and the
    plate's job is the look.
    
    The user's original instinct, that a drawn board was the right input, was correct throughout. The
    detour cost a badge burn-in and a run of numeral leaks.
    
    ### Arrows: a prohibition that lasted one commit
    
    The reference board this skill was modeled on carries numbers, captions and motion arrows, and its
    delivered video is clean. Reproducing that took five wrong explanations, and the prohibition written
    after the fourth survived exactly one commit before the fifth attempt replaced it. The sequence is
    kept in full because the wrong turns are the useful part.
    
    **"Arrows always transfer."** Drawn from one crisp white vector arrow rendering beside the dancer's
    hand. Killed by checking the reference board: `asset_get` confirms both the still and that heavily
    arrowed board (six arrowed panels, including a thick block arrow) went in as `referenceImages`, and 16
    samples of its delivery show no arrow anywhere.
    
    **"Naming arrows in a negative clause causes the leak."** Pre-registered, then falsified by deleting
    "No arrows, symbols or annotation marks of any kind in frame" and changing nothing else. The clause
    changed how the arrow rendered, from crisp white to dark red, not whether it appeared.
    
    **"The beats were not bound to their panels."** The original prompt names a panel in every beat and
    restates each entry pose, and the leaking prompts did neither, which also meant they dropped two of the
    six elements the skill's own table row 1 asks for. Falsified in the opposite direction: binding
    produced _both_ of panel 4's arrows where the unbound runs produced one each. Explicit binding raises
    panel fidelity, so more of the panel transfers, annotations included.
    
    **"Reference starvation."** The runs passed a character plate as `@image1` while the clean original
    passed a photographic still of the whole scene, so perhaps a plate leaves the model without a template
    for the frame, pushing it to mine the board for appearance. Appealing, because it also explains the
    binding result. Dropped without spending a run: identity held across all eight beats of every run and
    the model built a consistent candlelit courtyard from prose alone, so nothing in those deliveries looks
    like a model short of information. Seedance 2.5 taking a character sheet was never the question.
    
    At that point the skill said "never draw a motion arrow", resting on measurement with no mechanism.
    The user then made the observation that resolved it, about the drawing rather than the configuration:
    our board carried far more detail than the original, and its arrows were far darker.
    
    | Run | Board              | Arrows drawn        | Guides named as guides | Concept art  | Panel 4   | Panel 7   |
    | --- | ------------------ | ------------------- | ---------------------- | ------------ | --------- | --------- |
    | A   | heavy, dark arrows | 5 panels            | no, prohibition only   | no           | 1 arrow   | both      |
    | B   | heavy, dark arrows | 5 panels            | no                     | no           | 1 arrow   | clean     |
    | C   | heavy, dark arrows | 5 panels            | no                     | no           | **both**  | both      |
    | D   | light, soft pale   | 5 panels, same spot | yes                    | 3 key frames | **clean** | **clean** |
    
    Arrow placement was held identical across all four runs, so panels 4 and 7 are directly comparable.
    Panel 4 went from 3 of 3 leaking to clean, and run D swept 48 of 48 frames with nothing on screen.
    
    So the rule is not about arrows at all. It is about how heavily the board is drawn: a board drawn as a
    competing picture is treated as one, and its markings render as objects. Drawn light, the same
    markings in the same places transfer nothing, which means the annotated board a human wants to review
    is the same board the model gets, and the two-board workaround is unnecessary.
    
    Run D is a deliberate bundle of three changes, accepted as such rather than spending more runs on
    decomposition: the light board, the guide declaration, and the concept art. The cause is undetermined
    among them, and the cheapest decomposition if it ever matters is to drop the concept art and keep the
    other two, since concept art is the most expensive of the three to mandate. Two of the three earn
    their place on other grounds anyway: run D is the best-looking delivery of the session, its courtyard
    consistent with the key frames rather than reinvented.
    
    The prompt wording is the part that would not survive paraphrase, so it moved to
    [references/video-prompt.md](references/video-prompt.md) verbatim rather than being described. The
    load-bearing discovery inside it is that a prohibition failed three times where a definition worked:
    "the storyboard's frame borders, panel numbers, caption text and motion arrows are planning guides
    drawn on paper by the director. They describe the shot, they are not objects in the world."
    
    ### Verification has to sweep, not sample
    
    Run B's eight-beat check sampled panel 4 at 10.5s and came back clean. The arrow appears at 11.0s. Only
    a two-frames-a-second sweep of the whole clip caught it, and without that sweep this section would
    have recorded a false result. A leaked marking can fade in part-way through a shot, so one sample per
    shot is not a check. That is now a rule in the skill rather than a lesson in this file.
    
    ### Panel numbers: a non-problem once the board is pencil
    
    This question absorbed three rounds and turned out to be downstream of the register. An early run
    burned a white panel-number badge into the top-left corner of a 20-second clip, surviving an explicit
    "no panel numbers" clause, which read as proof that numbering must sit outside the frame. Then a
    controlled test had neither badge-inside board leak, which read as prominence rather than placement.
    Then a photoreal board leaked its numeral into 6 of 8 shots despite the negative clause.
    
    The resolution: numbering leaks from photoreal boards and not from pencil boards, at 0 of 14 across
    two runs. On the pencil board the skill now prescribes, numbering is safe in frame or under it, and
    the corner check stays only as cheap insurance. What survives from the whole detour is the smaller
    lesson, which did keep proving true: never trust a negative clause to remove what you drew.
    
    ### One plate per character, not a combined sheet
    
    Seedance 2.5 accepts up to 30 `referenceImages` and the prompt binds them by index, so `@image1` can
    be one character and `@image2` another. A combined turnaround gives each character an eighth of a
    canvas and leaves the model to work out which figure the prompt means. Per-character plates are
    unambiguous and full resolution. The earlier grouped sheet was habit, not a constraint.
    
    ### The plate is load-bearing at video time, not just upstream
    
    Recorded here in its original form because it was wrong and the correction matters. The observation was
    real: a photoreal board carried identity with no character plate in the video call, matching the best
    plate-bearing run, which suggested the plate's only job was keeping the cast consistent while the board
    was drawn.
    
    That conclusion does not survive the register reversal. A photoreal board can carry identity alone
    because it _is_ photographic reference, and it is exactly that property that burns its numbering into
    the delivery. A pencil board carries no surfaces, so on the board the skill now prescribes the plate
    supplies identity and material to the video run and dropping it is not an option. The plate does both
    jobs, upstream and at video time, in both lanes.
    
    ### Cinematic labels, not action verbs alone
    
    The first fight boards read as twelve pictures rather than coverage. Labeling every panel with number,
    shot size, angle, lens or camera move, then three action verbs, and arranging the panels as real
    coverage (master first, hold the axis, climb the size ladder, punctuate with inserts and reactions)
    produced boards and videos that read as filmed sequences. The vocabulary itself is standard
    cinematography that a model already knows, so `SKILL.md` spends its words on the instruction and the
    coverage rules rather than on a glossary.
    
    ### Seedance 2.5, discovered but not trusted to rank first
    
    `search` with `query="seedance"` returned 2.5 **last, at relevance score 0**, while 2.0 ranked first
    with a 15-second duration cap that cannot deliver a 24-second sequence. So the skill tells the agent to
    scan every hit for the newest non-deprecated generation instead of taking the first, and says why 2.5
    is the target: the largest reference count in the family and the best identity hold.
    
    ### An approval gate before any video run
    
    A board costs a fraction of a video run, so the skill stops for approval on the script, the plates and
    the numbered board, and invites a reshoot by panel number. Re-running one panel is a single board call
    with that clause changed and the approved board passed as a reference.
    
    ### Scripted run versus chained lane
    
    A single scripted run does not deliver a cut per scripted timecode. Against eleven scripted handoffs,
    detected hard cuts were 0, 2, 2 and 6 across runs: the model renders most handoffs as camera moves.
    That satisfies continuity, which is the point, but it is not editorial control. Twelve discrete shots
    require the chained lane.
    
    In the chained lane the pose chain protects motion and nothing else. Boundary stills are independent
    generations, so costume detail drifts between them (a mask, a helmet crest, a metal finish) and every
    drift lands on a cut. One clean-room run also mirrored two of its seven stills, which would have asked
    the fighters to swap sides mid-shot. Hence: pin screen position as well as pose, hold the framing, and
    review the stills as a set before spending a video run.
    
    ### Why the chained lane lives in a reference file
    
    Body words load on every trigger. After the fixes the body reached the point where the next lesson
    would break the 1400-word hard cap in force at the time, and the chained lane is per-mode detail
    that only a chained run needs (four of five live runs used the scripted lane). It moved to
    [references/chained-lane.md](references/chained-lane.md); the lane choice, the mutual-exclusion trap
    and the cost model stayed in the body.
    
    ## What the chained-lane validation added
    
    A clean-room agent was given a 40-second knife duel that had to open on an exact pose, which forces
    the chained lane, with only the installed skill as documentation. It picked the lane from the one
    sentence about reference mode anchoring frame one, followed the link to the reference, applied all four
    disciplines, and verified every join for free from `asset_get`. Frame one was the specified locked-blades
    pose and all three joins were the same pose either side of the cut. Four defects came out of it:
    
    - **The board and the image budget could contradict each other.** Two plates, a board and five stills
      hit an eight-image ceiling exactly, leaving nothing to re-render a drifted still, which is the
      dominant failure in this lane. The reference now ranks the board below a reserved repair slot and
      says why: the board is never passed to the video model here.
    - **No plate or board model was named at runtime.** The only named one lived in this file, which the
      agent correctly discounted as maintainer notes. `SKILL.md` now carries a hedged authoring-time
      example alongside the selection criteria.
    - **A height like 1080 can miss the image model's `step`,** failing as an opaque internal error. Folded
      into the existing canvas sentence.
    - **A shot can be refused on its generated audio, not its picture.** `generateAudio: false` clears it.
      Covered in the reference, with the instruction not to leave one shot silent while others carry sound.
    
    ## The coherence gate, and why the quality gate alone is not it
    
    Two boards reached a video run carrying frames that break physical sense: an extreme close-up with four
    gauntlets for two fighters, an unattached glove and a hilt guard floating with no blade through it; and
    a low-angle wheel shot whose car had two different wheels, only one whitewall, no wheel arch, and a
    toy-proportioned body. Neither survives a viewer's first glance, and both cost a full video run.
    
    Three measurements shaped the gate that now exists:
    
    - **A board-level verdict hides panel defects.** All three boards scored 88 and `pass` at high
      sensitivity while carrying those frames. Twelve panels average their defects away.
    - **Scoring the panel alone does not fix that either.** The broken-car panel, scored in isolation, came
      back 92 and `pass`, and the report praised the "chrome rims" that were the defect. The gate detects
      artifacts; it has never seen the plate, so it cannot know the car should wear matching whitewalls in
      proper arches.
    - **The score is a weak signal for a repair.** The corrected wheel panel also scored 92. What changed
      was the flaw list, from praising the rims to naming a taillight housing. Judge a repair on the
      differences checklist and the new `reasons`, not on the number.
    
    So the gate is two passes per panel, and a panel must clear both: `asset_quality_gate_run` for
    artifacts (it did find melted finger joints, warped speedometer numerals and doubled blade edges that
    the eye skipped), and a spot-the-difference against the plate for anything only wrong beside the
    reference. What the two passes found together, across three boards: samurai 4 and 10, cars 2, 3, 8 and
    11, dancer 3, 7 and 8.
    
    Repair is by replacement, not by re-rolling the board: slice with `model_scenario-image-slicer`,
    regenerate only the failing panel with the plates as references and the correction stated positively,
    then recompose with `model_scenario-compose-image` so approved panels are pasted rather than
    regenerated. Measured cost of the loop: 1 CU to slice, 1 CU per panel scored, 47 CU per repaired panel,
    2 CU to recompose, against 2730 CU for the video run it protects.
    
    One honest side effect: replacing a whole cell replaces its caption too, so a repaired panel's label
    renders at a slightly different size from its neighbors. Compositing only the art region over the
    original cell would avoid it, at the cost of locating that region per board.
    
    ## The full-flow validation, three sequences from scratch
    
    Three new sequences were built end to end through all nine steps: a flamenco courtyard, a staff duel on
    a temple terrace, and a 1970s night rally. New cast, new compositions, 8 panels each at 3 seconds, 24
    panels generated individually, all 24 gated, 8 repaired, 3 boards composed, 3 videos delivered.
    
    What it proved and changed:
    
    - **Per-panel gating localizes what board scoring hid.** Six panels warned or scored low across the
      three sequences, and every finding was specific: melted fingers on the floreo, warped rally dials, a
      staff broken into two misaligned segments, a driver's hand fused to the wheel. All had passed my own
      eye first.
    - **The differences pass caught what the gate never mentions.** In one rally panel the yellow car sat
      ahead of the white, contradicting the brief. Every score on that panel was fine.
    - **An intentional annotation reads as a defect.** The gate flagged the small in-frame panel numeral as
      "an unwanted watermark" on every single panel, depressing scores by a design decision. Worth knowing
      before treating per-panel scores as absolute.
    - **A composed board must stay inside a 0.4 to 2.5 aspect ratio.** Two 1080p runs failed outright on a
      four-by-two grid of 16:9 panels (3.56). Three-by-three (1.78) passed. Only the job record's `hint`
      names the range.
    - **Some panel flaws do not reach the video.** The staff sequence was the worst-scoring board of the
      three, flagged five times for hands merging into wood and staffs bending, and it still delivered a
      clean 24 seconds with rigid staffs and four distinct hands at the bind. Prop geometry gets re-derived;
      burned-in graphics and plan errors do not. That distinction now sits in the reference, because it
      decides how many repair rounds a flaw class deserves.
    
    Also measured: the actual spend for the whole PR came to about 26k CU, against a running estimate of
    41k that had been accumulated from per-call arithmetic rather than read from `usage`. Read the meter.
    
    ## What the plan-only validation found
    
    A clean-room agent, given only the installed skill and a 24-second eight-shot fight brief, produced an
    85-call plan and followed every rule this PR added without prompting: light board, diegetic audio with
    no instrument named, the 2 fps sweep, the 0.4 to 2.5 board ratio (noting correctly that it only binds
    when the board is actually passed), per-panel gating, collection before generation, `jobs_wait` with
    `pending_job_ids`, discovery instead of an asserted model id, and `aspectRatio` omitted in
    first/last-frame mode. It flagged eight uncertainties rather than guessing.
    
    It also found that the brief was impossible, which no one on this side had noticed. `SKILL.md` routes
    discrete shots to the chained lane, but `duration` accepts only -1 or 4 to 30, so eight chained shots
    occupy at least 32 seconds while the scripted lane will not honor eight cuts in 24. The worked example
    compounded it by scripting twelve shots across 24 seconds, two seconds each. Six defects came out of
    it, all fixed:
    
    - **The duration floor was never stated**, so the lane's cost arithmetic invited impossible plans. Now
      in the body and spelled out with the numbers in the chained-lane reference.
    - **The size ladder and hold-the-framing contradicted each other.** Both sides of a chained cut are the
      same frame, so shot size cannot change at a join. The agent called this the hardest decision in the
      task and resolved it by inference. Now reconciled explicitly.
    - **`video-prompt.md` read as lane-neutral** while two of its seven sections only apply to the scripted
      lane, and the chained lane had no prompt shape at all. Now labeled, with the five sections that carry
      over named.
    - **Step 8's key frames had no home in the chained lane**, which has no `referenceImages` slot. The
      boundary stills are the key frames; said so.
    - **The board was the approval artifact in one file and "the first thing to drop" in another**, which
      bit immediately because the brief asked for storyboard sign-off.
    - **No step elicited the creative brief**, though the plate is load-bearing everywhere after it.
    
    Two things were deliberately not filed as defects. The agent named `numImages` where the real parameter
    is `numOutputs`, but the skill never discusses image-model parameters and the plan had already
    scheduled the schema read that would have caught it. And all six named siblings were absent from the
    clean room, which is the known install-resolution gap: the invitation sentence fired correctly and the
    agent flagged the affected phase instead of inventing a model id.
    
    The lesson for this file: five paid video runs found the register and arrow rules, and one free
    plan-only run found a correctness bug that would have sent a user down an impossible path. Run the
    cheap test first.
    
    ## Felt cuts are not what either lane delivers
    
    Two clean-room agents, given different briefs, both asked for cuts a viewer could feel, both chose the
    chained lane because `SKILL.md` routed discrete shots there, and both then extrapolated the same
    untested workaround: render each boundary twice, one still per framing, and treat the pair as a match
    cut. Neither had documentation for it. Both invented it from the same sentence, which said a size
    change at a join "would need two different stills of one pose" as a reason it could not work. A
    sentence that reliably produces the inference it was arguing against is a defect whatever it intended.
    
    The measurements say neither lane gives editorially distinct cuts. The scripted lane converted eleven
    scripted handoffs into 0, 2, 2 and 6 detected hard cuts across four runs, rendering the rest as camera
    moves. The chained lane makes both sides of a join the same frame, so the coverage size cannot differ
    across it and the join reads as continuous motion by construction.
    
    So the skill now says what it delivers in the Overview rather than leaving it to be derived after a
    lane is chosen, stops describing the paired-stills mechanism, and routes the want to where it actually
    works: deliver the continuous take and cut it at your own points with `scenario-video-editing`. The
    momentum is real because it was one take, the cuts are real because an editor made them, the cut points
    are exact and free to move, and nothing needs re-rendering.
    
    The paired-stills idea was deliberately not priced as an option. It is unmeasured, it doubles the still
    budget, it cannot be checked without a paid video run, and recommending an untested technique inside a
    skill whose whole purpose is to stop an agent guessing would undercut the rest of the file. Two
    independent agents converging on it is a reason to close the inference off, not to bless it.
    
    The `description` was left alone on purpose. Someone who wants six felt cuts should still trigger this
    skill, because it now carries the answer for them; narrowing the keywords would hide the guidance from
    exactly the reader who needs it.
    
    ## The six plan-only defects, and one caught by verification
    
    A third clean-room run on a scripted-lane brief (the first two both chose the chained lane, so the
    scripted half had never been read cold) came back a pass with six non-blocking items. All six are fixed:
    the compose canvas fields now say to read them off `model_schema_get`, `generateAudio`'s default-on is
    stated so sound needs no flag, the audio check is named as eyes and ears with the warning that a useless
    run looks like a good one, the grid guidance generalizes, the caps are read before the script is
    written, and the deliverable statement moved to the Overview's third sentence.
    
    That run also confirmed the earlier fixes in a way a repeat brief could not have: the duration floor was
    used in reverse, to disqualify the chained lane at "4 s floor x 6 shots = 24 s > 20 s", and the audio
    lane scoping held with `generateAudio: true` in a scripted prompt and no confusion with the chained
    lane's picture-only rule.
    
    The fix for the grid item was wrong on the first attempt, and how it was caught is the part worth
    keeping. Replacing two correct examples with a general rule produced "three columns is the most that
    stays inside the range", which is false: four by three is 2.37 and sits inside it. Worse, the rule was
    unsound in both directions, since "at most three columns" permits three by two at 2.67, which the same
    sentence names as a failure, and it forbids four by three, the natural layout for this skill's own
    12-panel worked example. A five-panel board obeying it lands on 3x2 (2.67) or 1x5 (0.356) and fails
    either way.
    
    Nineteen candidate findings came out of four verification passes over the diff, run with distinct
    lenses: lost content, internal contradiction, whether each fix closes its defect, and mechanical
    compliance. Seventeen were rejected under adversarial re-check, including two that attacked the same
    grid paragraph for having wrong numbers, which it did not. The two that survived were the two that
    correctly identified the rule rather than the arithmetic as the error. Both proposed stating the formula,
    which is what the file now does.
    
    The lesson is narrower than "verify more". Replacing correct-but-narrow examples with a general rule is
    the single riskiest edit in a reference file, because a confidently stated wrong rule is worse than the
    vague text it replaced, and it reads as more authoritative. Two attacks on the canvas-fields fix were
    also rejected here on solid evidence, one verifier checking the live schema and another the sibling
    `scenario-video-assembly` skill, both confirming `canvasWidth` and `canvasHeight` are real. A harness
    that rejects seventeen of nineteen findings is doing its job in both directions.
    
    ## Open questions
    
    - How reliably a single-panel reshoot holds the other panels. Verified once: with the approved board
      passed as a third reference and only panel 9's clause changed, panel 9 was corrected and the other
      eleven panels came back unchanged, labels included. One trial is not a guarantee.
    - Whether the register finding generalizes to non-photoreal deliveries: an animation-style board for an
      animation-style delivery should follow the same logic, untested.
    - Which of run D's three changes suppresses the markings. Undetermined by design. One run separates
      the concept art from the other two.
    - Where the line falls between a board light enough to stay a plan and one heavy enough to be copied.
      Only the two extremes have been measured.
    
  • SKILL.md 10.6 KB
    ---
    name: scenario-seedance-storyboard
    description: "Use when a Seedance video must hold continuous movement across shots: dance choreography, fights, sports, or any performance where limbs teleport, feet slide, or motion resets at every cut, or when turning a storyboard and character sheet into a multi-shot sequence that plays as one take. Keywords: storyboard to video, choreography, movement control, pose chain, timecoded shot script, first and last frame chaining, character sheet, multi-shot continuity, Seedance 2.5 and 2.0."
    license: MIT
    ---
    
    # Scenario Seedance Storyboard
    
    ## Overview
    
    Prompted shot by shot, generated movement falls apart: limbs teleport, feet slide, and every cut resets the performance. So storyboard instead of prompting harder. What this delivers is continuous motion through the handoffs, not editorially distinct cuts: for cuts a viewer can feel, cut the delivered clip yourself with `scenario-video-editing`. Write a timecoded shot script, draw a character sheet and a numbered panel per shot, and hold one rule: every shot ends in the pose the next one starts from. Pinned boundaries leave nothing to reset, so the cuts play as one performance.
    
    Connection and the core loop: the `scenario` skill; the Seedance parameter contract, conditioning traps, and sound lanes: the `scenario-seedance` skill; identity across stills and a reusable character sheet: the `scenario-consistency` and `scenario-identity-library` skills; a board or comic page that is itself the deliverable: the `scenario-storyboards` skill; splitting and rejoining shots: the `scenario-video-editing` and `scenario-video-assembly` skills. If a sibling skill named here is missing from your available skills, ask the user to install it (`npx skills add scenario-labs/skills --skill <name>`); unattended, proceed from tool schemas and flag the gap.
    
    ## Quick reference
    
    | Step        | What                                                                                           | How                                                                             |
    | ----------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
    | 1. Script   | timecoded list, cast and setting agreed first                                                  | per shot: number, size, angle, lens or move, action verbs, entry and exit poses |
    | 2. Plates   | one image per performer who must stay recognizable, several angles; extras generic and unnamed | image model via `recommend`; one clean still of a real performer also works     |
    | 3. Briefs   | one line per panel, coverage not pictures                                                      | master first, hold the axis, climb the size ladder, punctuate                   |
    | 4. Panels   | one `model_run` per panel                                                                      | plates as references, light pencil line on bare paper, each at delivery ratio   |
    | 5. Gate     | two passes per panel, then repair one panel                                                    | artifacts and differences, per [board-craft](references/board-craft.md)         |
    | 6. Assemble | the approved panels into the board                                                             | `model_scenario-compose-image` at explicit coordinates                          |
    | 7. Approve  | script, plates, board shown to the user                                                        | reshoot by panel number; unattended, record and continue                        |
    | 8. Frames   | two or three photoreal key frames                                                              | same plates, delivery ratio; they set the delivered look                        |
    | 9. Video    | one scripted run, or chained runs                                                              | Seedance `model_run`, one of the two lanes below                                |
    | 10. Check   | the delivery is clean and carries its track                                                    | sample every half second, not only the cuts, and match each cut to its panel    |
    
    Label each panel as a shot list does: number, shot size, angle, lens or camera move, then three action verbs. Arrange them as coverage, not twelve pictures: open on a master that sets the geography, hold one side of the axis so screen direction never flips, climb the size ladder, and punctuate with an insert or a reaction. Adjacent shots share an edge by construction: shot 3's exit is shot 4's entry.
    
    Draw the board light: thin pale line on bare paper, the setting in two or three quick lines, no rendered environment. A board drawn as a competing picture is treated as one, and its markings render into the delivery as objects, which no prompt clause can clean. Drawn light, the same markings transfer nothing, so numbers, captions and arrows can all stay on the board a human reviews. What carries that is prompt wording, not drawing: declare the marks as the director's planning guides rather than prohibiting them, and pass the key frames as concept art so appearance has a photographic source. Both are in [video-prompt.md](references/video-prompt.md).
    
    Panels are generated one at a time, so one bad panel costs one panel, and gated before any video run on two passes: an AI-quality score for artifacts, and a spot-the-difference against the plate. A board-level verdict is not the bar: panels average defects away.
    
    File as you go: one collection per sequence, created before the first generation, holding plates, panels, repairs, board and video ([board-craft](references/board-craft.md)).
    
    Stop for approval before the first video run, with the key frames shown alongside the script, plates and board, and invite a reshoot by panel number; unattended, record the assumption and continue.
    
    ## Two lanes
    
    **One scripted run.** When the sequence fits one job's duration cap (30 seconds on 2.5 at authoring time), pass the plates, board and key frames as `referenceImages` and build the prompt to the seven-section shape in [video-prompt.md](references/video-prompt.md). One generation carries the internal cuts: the plates hold identity, the pose chain holds continuity. Name `aspectRatio`; it defaults to `adaptive` here, so a portrait board hands back a portrait video. Reference mode anchors frame one to the base state of the reference world (see `scenario-seedance`), so a sequence that must open on an exact pose belongs in the chained lane.
    
    **Chained per-shot runs.** Past the duration cap, when each shot needs its own control, or when the sequence must open on an exact pose: render each boundary pose as a still, then run shot N with `image` = still N-1 and `lastFrameImage` = still N, so adjacent shots share a frame both sides agree on. This excludes `referenceImages`, so the stills are a shot's only identity, and N shots cost N+1 stills and N runs. Each run also has a duration floor (4 whole seconds on 2.5 at authoring time), so N shots cannot total less than N times it, and more cuts than that means fewer shots or more seconds. The disciplines and the repair path are in [references/chained-lane.md](references/chained-lane.md).
    
    ## Worked example: a 12-shot dance in one run
    
    1. Write the script: 12 shots over 24 seconds, edge poses named, every exit matching the next entry. Show it to the user first; it is the cheapest place to be wrong; unattended, write it down and continue.
    2. Generate one plate per character, then the 12 panels, then two or three photoreal key frames from the same plates. Upload anything local with `upload_asset` (see the `scenario` skill). Show the board and the key frames to the user before going further.
    3. `search` with `target="models"`, `query="seedance"`, `public=true`. Hits rank by relevance, not generation, so scan them all for the newest non-deprecated member rather than the first: at authoring time `model_bytedance-seedance-2-5` (re-discover each session), which takes the most references and holds identity best. Then `model_schema_get` for caps.
    4. `model_run` with `dry_run=true` and `parameters={"prompt": "<the timecoded script>", "referenceImages": ["asset_dancer", "asset_board", "asset_key1", "asset_key2"], "duration": 24, "resolution": "1080p", "aspectRatio": "16:9"}`; re-estimate after any change.
    5. Re-run with `wait=false`, then `jobs_wait`, re-called with `pending_job_ids` on timeout. A timeout is not a failure and never justifies a second `model_run`.
    6. Step through the cuts: both sides must agree in pose and match the panel. Then sweep the whole clip at two frames a second, because a leaked board marking can fade in part-way through a shot, so one sample per shot reports a false clean. `asset_display` returns a link for video, not frames, so pull them locally or with `model_scenario-video-to-image-seq` (a fixed id: Scenario's single deterministic frame-extraction tool, so discovery would only re-derive it). Expect fewer cuts than scripted: most handoffs render as camera moves, so cut the delivered take at the twelve scripted points.
    
    ## Common mistakes
    
    - Prompting choreography as adjectives ("dances energetically"): timecoded verbs and edge poses survive generation; mood words do not.
    - Naming the pose but not the position: in a two-character scene a mirrored boundary still breaks the cut as hard as a wrong limb.
    - Scripting a character who leaves frame and returns, or a change made off camera, inside one run: whatever leaves frame is gone for the rest of that run, and no boundary check can catch what happened out of shot. Land departures, returns and state changes on a chained boundary still ([chained-lane](references/chained-lane.md)).
    - Expecting a scripted run to open on a prompt-described pose: reference mode anchors frame one to the base state; exact openings are the chained lane's job.
    - Delivering silence by default: ask for diegetic sound by naming its sources, and name no instrument, genre, or exclusion such as "no music", which is what triggers an audio refusal. `generateAudio: false` is the fallback, not the default.
    - A script past the prompt's `max_length`, or timecodes past the duration cap: read both off `model_schema_get` before writing the script, since step 1 comes before discovery; an overrun is a 400, never a trim. Then send the run's scripted length as `duration`: its default is Auto (-1), which the schema defines only against a reference clip, so a timecoded script sent without it runs for an unstated length.
    - Getting the ratios wrong: each panel must carry the delivery ratio, since a reframe moves the poses the chain depends on, and the composed board must land inside a 0.4 to 2.5 aspect ratio or Seedance rejects it as a reference and the run fails.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related