{"slug":"scenario-seedance-storyboard","title":"scenario-seedance-storyboard","summary":"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 ","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-17T09:10:50.012663Z","repo":{"url":"https://github.com/scenario-labs/skills","stars":1035,"forks":129,"license":"MIT","updatedAt":"2026-10-17T05:01:44Z"},"bodyHtml":"<h1>How this skill was built</h1>\n<p>Maintainer notes, not runtime instructions. Every rule in <code>SKILL.md</code> below is tied to the live run\nthat produced it, so a future edit can check whether the evidence still holds rather than re-arguing\nfrom taste. All runs used Seedance 2.5 and GPT Image 2 through the Scenario MCP server.</p>\n<h2>Why a separate skill</h2>\n<p>The pose-chain workflow existed nowhere in the repo: the only trace was one sentence in\n<code>scenario-seedance-music-video/references/shots.md</code>, a supporting file of a different skill. It could\nnot be folded into <code>scenario-seedance</code> either, because that body was already at the top of the house\nword target and the combined text would have blown the hard cap. The triggering conditions also\ndiffer: the family skill fires on parameter and conditioning questions, this one fires on a symptom\n(\"limbs teleport\", \"motion resets at every cut\"). A baseline probe with no skill installed had the\nagent reconstruct the chaining mechanism itself and flag it as guesswork.</p>\n<h2>Decisions and the evidence</h2>\n<h3>Pencil panels with photographic plates, not photoreal panels</h3>\n<p>Reversed twice, and the second reversal is the one that holds. The skill first said pencil, then said\nphotoreal on the strength of a 2x2 test, and now says pencil again because that test never contained\nthe cell that matters.</p>\n<p>The 2x2 compared board style against number placement with the character sheet held constant, and\nconcluded photoreal because pencil-plus-render-sheet drifted toward posed action-figure plastic. What\nit never ran cleanly was pencil board plus a <em>photographic</em> plate. That cell was finally measured with\nthe prompt held byte-identical and only the register changed:</p>\n<ul>\n<li>Photoreal board: the panel numeral leaked into 6 of 8 delivered shots, despite an explicit negative\nclause naming it. The quality gate had flagged that numeral as \"an unwanted watermark\" on all 24\npanels of the earlier boards and was overridden. It was right.</li>\n<li>Pencil board: 0 of 7 numerals and 0 of 8 captions transferred, and the delivery was fully filmic,\ncandlelit stone and fabric weight, not plastic. The plate supplied the surfaces the drawing did not.</li>\n</ul>\n<p>Repeated on a second run of the same board: 0 leaks in 30 opportunities across the two runs. The\nmechanism, stated as narrowly as the evidence allows: a drawn board reads as notation and is\ndiscarded, a photoreal board reads as picture and is copied. So the board's job is the plan, and the\nplate's job is the look.</p>\n<p>The user's original instinct, that a drawn board was the right input, was correct throughout. The\ndetour cost a badge burn-in and a run of numeral leaks.</p>\n<h3>Arrows: a prohibition that lasted one commit</h3>\n<p>The reference board this skill was modeled on carries numbers, captions and motion arrows, and its\ndelivered video is clean. Reproducing that took five wrong explanations, and the prohibition written\nafter the fourth survived exactly one commit before the fifth attempt replaced it. The sequence is\nkept in full because the wrong turns are the useful part.</p>\n<p><strong>\"Arrows always transfer.\"</strong> Drawn from one crisp white vector arrow rendering beside the dancer's\nhand. Killed by checking the reference board: <code>asset_get</code> confirms both the still and that heavily\narrowed board (six arrowed panels, including a thick block arrow) went in as <code>referenceImages</code>, and 16\nsamples of its delivery show no arrow anywhere.</p>\n<p><strong>\"Naming arrows in a negative clause causes the leak.\"</strong> Pre-registered, then falsified by deleting\n\"No arrows, symbols or annotation marks of any kind in frame\" and changing nothing else. The clause\nchanged how the arrow rendered, from crisp white to dark red, not whether it appeared.</p>\n<p><strong>\"The beats were not bound to their panels.\"</strong> The original prompt names a panel in every beat and\nrestates each entry pose, and the leaking prompts did neither, which also meant they dropped two of the\nsix elements the skill's own table row 1 asks for. Falsified in the opposite direction: binding\nproduced <em>both</em> of panel 4's arrows where the unbound runs produced one each. Explicit binding raises\npanel fidelity, so more of the panel transfers, annotations included.</p>\n<p><strong>\"Reference starvation.\"</strong> The runs passed a character plate as <code>@image1</code> while the clean original\npassed a photographic still of the whole scene, so perhaps a plate leaves the model without a template\nfor the frame, pushing it to mine the board for appearance. Appealing, because it also explains the\nbinding result. Dropped without spending a run: identity held across all eight beats of every run and\nthe model built a consistent candlelit courtyard from prose alone, so nothing in those deliveries looks\nlike a model short of information. Seedance 2.5 taking a character sheet was never the question.</p>\n<p>At that point the skill said \"never draw a motion arrow\", resting on measurement with no mechanism.\nThe user then made the observation that resolved it, about the drawing rather than the configuration:\nour board carried far more detail than the original, and its arrows were far darker.</p>\n<table>\n<thead>\n<tr>\n<th>Run</th>\n<th>Board</th>\n<th>Arrows drawn</th>\n<th>Guides named as guides</th>\n<th>Concept art</th>\n<th>Panel 4</th>\n<th>Panel 7</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A</td>\n<td>heavy, dark arrows</td>\n<td>5 panels</td>\n<td>no, prohibition only</td>\n<td>no</td>\n<td>1 arrow</td>\n<td>both</td>\n</tr>\n<tr>\n<td>B</td>\n<td>heavy, dark arrows</td>\n<td>5 panels</td>\n<td>no</td>\n<td>no</td>\n<td>1 arrow</td>\n<td>clean</td>\n</tr>\n<tr>\n<td>C</td>\n<td>heavy, dark arrows</td>\n<td>5 panels</td>\n<td>no</td>\n<td>no</td>\n<td><strong>both</strong></td>\n<td>both</td>\n</tr>\n<tr>\n<td>D</td>\n<td>light, soft pale</td>\n<td>5 panels, same spot</td>\n<td>yes</td>\n<td>3 key frames</td>\n<td><strong>clean</strong></td>\n<td><strong>clean</strong></td>\n</tr>\n</tbody>\n</table>\n<p>Arrow placement was held identical across all four runs, so panels 4 and 7 are directly comparable.\nPanel 4 went from 3 of 3 leaking to clean, and run D swept 48 of 48 frames with nothing on screen.</p>\n<p>So the rule is not about arrows at all. It is about how heavily the board is drawn: a board drawn as a\ncompeting picture is treated as one, and its markings render as objects. Drawn light, the same\nmarkings in the same places transfer nothing, which means the annotated board a human wants to review\nis the same board the model gets, and the two-board workaround is unnecessary.</p>\n<p>Run D is a deliberate bundle of three changes, accepted as such rather than spending more runs on\ndecomposition: the light board, the guide declaration, and the concept art. The cause is undetermined\namong them, and the cheapest decomposition if it ever matters is to drop the concept art and keep the\nother two, since concept art is the most expensive of the three to mandate. Two of the three earn\ntheir place on other grounds anyway: run D is the best-looking delivery of the session, its courtyard\nconsistent with the key frames rather than reinvented.</p>\n<p>The prompt wording is the part that would not survive paraphrase, so it moved to\n<a href=\"references/video-prompt.md\">references/video-prompt.md</a> verbatim rather than being described. The\nload-bearing discovery inside it is that a prohibition failed three times where a definition worked:\n\"the storyboard's frame borders, panel numbers, caption text and motion arrows are planning guides\ndrawn on paper by the director. They describe the shot, they are not objects in the world.\"</p>\n<h3>Verification has to sweep, not sample</h3>\n<p>Run B's eight-beat check sampled panel 4 at 10.5s and came back clean. The arrow appears at 11.0s. Only\na two-frames-a-second sweep of the whole clip caught it, and without that sweep this section would\nhave recorded a false result. A leaked marking can fade in part-way through a shot, so one sample per\nshot is not a check. That is now a rule in the skill rather than a lesson in this file.</p>\n<h3>Panel numbers: a non-problem once the board is pencil</h3>\n<p>This question absorbed three rounds and turned out to be downstream of the register. An early run\nburned a white panel-number badge into the top-left corner of a 20-second clip, surviving an explicit\n\"no panel numbers\" clause, which read as proof that numbering must sit outside the frame. Then a\ncontrolled test had neither badge-inside board leak, which read as prominence rather than placement.\nThen a photoreal board leaked its numeral into 6 of 8 shots despite the negative clause.</p>\n<p>The resolution: numbering leaks from photoreal boards and not from pencil boards, at 0 of 14 across\ntwo runs. On the pencil board the skill now prescribes, numbering is safe in frame or under it, and\nthe corner check stays only as cheap insurance. What survives from the whole detour is the smaller\nlesson, which did keep proving true: never trust a negative clause to remove what you drew.</p>\n<h3>One plate per character, not a combined sheet</h3>\n<p>Seedance 2.5 accepts up to 30 <code>referenceImages</code> and the prompt binds them by index, so <code>@image1</code> can\nbe one character and <code>@image2</code> another. A combined turnaround gives each character an eighth of a\ncanvas and leaves the model to work out which figure the prompt means. Per-character plates are\nunambiguous and full resolution. The earlier grouped sheet was habit, not a constraint.</p>\n<h3>The plate is load-bearing at video time, not just upstream</h3>\n<p>Recorded here in its original form because it was wrong and the correction matters. The observation was\nreal: a photoreal board carried identity with no character plate in the video call, matching the best\nplate-bearing run, which suggested the plate's only job was keeping the cast consistent while the board\nwas drawn.</p>\n<p>That conclusion does not survive the register reversal. A photoreal board can carry identity alone\nbecause it <em>is</em> photographic reference, and it is exactly that property that burns its numbering into\nthe delivery. A pencil board carries no surfaces, so on the board the skill now prescribes the plate\nsupplies identity and material to the video run and dropping it is not an option. The plate does both\njobs, upstream and at video time, in both lanes.</p>\n<h3>Cinematic labels, not action verbs alone</h3>\n<p>The first fight boards read as twelve pictures rather than coverage. Labeling every panel with number,\nshot size, angle, lens or camera move, then three action verbs, and arranging the panels as real\ncoverage (master first, hold the axis, climb the size ladder, punctuate with inserts and reactions)\nproduced boards and videos that read as filmed sequences. The vocabulary itself is standard\ncinematography that a model already knows, so <code>SKILL.md</code> spends its words on the instruction and the\ncoverage rules rather than on a glossary.</p>\n<h3>Seedance 2.5, discovered but not trusted to rank first</h3>\n<p><code>search</code> with <code>query=\"seedance\"</code> returned 2.5 <strong>last, at relevance score 0</strong>, while 2.0 ranked first\nwith a 15-second duration cap that cannot deliver a 24-second sequence. So the skill tells the agent to\nscan every hit for the newest non-deprecated generation instead of taking the first, and says why 2.5\nis the target: the largest reference count in the family and the best identity hold.</p>\n<h3>An approval gate before any video run</h3>\n<p>A board costs a fraction of a video run, so the skill stops for approval on the script, the plates and\nthe numbered board, and invites a reshoot by panel number. Re-running one panel is a single board call\nwith that clause changed and the approved board passed as a reference.</p>\n<h3>Scripted run versus chained lane</h3>\n<p>A single scripted run does not deliver a cut per scripted timecode. Against eleven scripted handoffs,\ndetected hard cuts were 0, 2, 2 and 6 across runs: the model renders most handoffs as camera moves.\nThat satisfies continuity, which is the point, but it is not editorial control. Twelve discrete shots\nrequire the chained lane.</p>\n<p>In the chained lane the pose chain protects motion and nothing else. Boundary stills are independent\ngenerations, so costume detail drifts between them (a mask, a helmet crest, a metal finish) and every\ndrift lands on a cut. One clean-room run also mirrored two of its seven stills, which would have asked\nthe fighters to swap sides mid-shot. Hence: pin screen position as well as pose, hold the framing, and\nreview the stills as a set before spending a video run.</p>\n<h3>Why the chained lane lives in a reference file</h3>\n<p>Body words load on every trigger. After the fixes the body reached the point where the next lesson\nwould break the 1400-word hard cap in force at the time, and the chained lane is per-mode detail\nthat only a chained run needs (four of five live runs used the scripted lane). It moved to\n<a href=\"references/chained-lane.md\">references/chained-lane.md</a>; the lane choice, the mutual-exclusion trap\nand the cost model stayed in the body.</p>\n<h2>What the chained-lane validation added</h2>\n<p>A clean-room agent was given a 40-second knife duel that had to open on an exact pose, which forces\nthe chained lane, with only the installed skill as documentation. It picked the lane from the one\nsentence about reference mode anchoring frame one, followed the link to the reference, applied all four\ndisciplines, and verified every join for free from <code>asset_get</code>. Frame one was the specified locked-blades\npose and all three joins were the same pose either side of the cut. Four defects came out of it:</p>\n<ul>\n<li><strong>The board and the image budget could contradict each other.</strong> Two plates, a board and five stills\nhit an eight-image ceiling exactly, leaving nothing to re-render a drifted still, which is the\ndominant failure in this lane. The reference now ranks the board below a reserved repair slot and\nsays why: the board is never passed to the video model here.</li>\n<li><strong>No plate or board model was named at runtime.</strong> The only named one lived in this file, which the\nagent correctly discounted as maintainer notes. <code>SKILL.md</code> now carries a hedged authoring-time\nexample alongside the selection criteria.</li>\n<li><strong>A height like 1080 can miss the image model's <code>step</code>,</strong> failing as an opaque internal error. Folded\ninto the existing canvas sentence.</li>\n<li><strong>A shot can be refused on its generated audio, not its picture.</strong> <code>generateAudio: false</code> clears it.\nCovered in the reference, with the instruction not to leave one shot silent while others carry sound.</li>\n</ul>\n<h2>The coherence gate, and why the quality gate alone is not it</h2>\n<p>Two boards reached a video run carrying frames that break physical sense: an extreme close-up with four\ngauntlets for two fighters, an unattached glove and a hilt guard floating with no blade through it; and\na low-angle wheel shot whose car had two different wheels, only one whitewall, no wheel arch, and a\ntoy-proportioned body. Neither survives a viewer's first glance, and both cost a full video run.</p>\n<p>Three measurements shaped the gate that now exists:</p>\n<ul>\n<li><strong>A board-level verdict hides panel defects.</strong> All three boards scored 88 and <code>pass</code> at high\nsensitivity while carrying those frames. Twelve panels average their defects away.</li>\n<li><strong>Scoring the panel alone does not fix that either.</strong> The broken-car panel, scored in isolation, came\nback 92 and <code>pass</code>, and the report praised the \"chrome rims\" that were the defect. The gate detects\nartifacts; it has never seen the plate, so it cannot know the car should wear matching whitewalls in\nproper arches.</li>\n<li><strong>The score is a weak signal for a repair.</strong> The corrected wheel panel also scored 92. What changed\nwas the flaw list, from praising the rims to naming a taillight housing. Judge a repair on the\ndifferences checklist and the new <code>reasons</code>, not on the number.</li>\n</ul>\n<p>So the gate is two passes per panel, and a panel must clear both: <code>asset_quality_gate_run</code> for\nartifacts (it did find melted finger joints, warped speedometer numerals and doubled blade edges that\nthe eye skipped), and a spot-the-difference against the plate for anything only wrong beside the\nreference. What the two passes found together, across three boards: samurai 4 and 10, cars 2, 3, 8 and\n11, dancer 3, 7 and 8.</p>\n<p>Repair is by replacement, not by re-rolling the board: slice with <code>model_scenario-image-slicer</code>,\nregenerate only the failing panel with the plates as references and the correction stated positively,\nthen recompose with <code>model_scenario-compose-image</code> so approved panels are pasted rather than\nregenerated. Measured cost of the loop: 1 CU to slice, 1 CU per panel scored, 47 CU per repaired panel,\n2 CU to recompose, against 2730 CU for the video run it protects.</p>\n<p>One honest side effect: replacing a whole cell replaces its caption too, so a repaired panel's label\nrenders at a slightly different size from its neighbors. Compositing only the art region over the\noriginal cell would avoid it, at the cost of locating that region per board.</p>\n<h2>The full-flow validation, three sequences from scratch</h2>\n<p>Three new sequences were built end to end through all nine steps: a flamenco courtyard, a staff duel on\na temple terrace, and a 1970s night rally. New cast, new compositions, 8 panels each at 3 seconds, 24\npanels generated individually, all 24 gated, 8 repaired, 3 boards composed, 3 videos delivered.</p>\n<p>What it proved and changed:</p>\n<ul>\n<li><strong>Per-panel gating localizes what board scoring hid.</strong> Six panels warned or scored low across the\nthree sequences, and every finding was specific: melted fingers on the floreo, warped rally dials, a\nstaff broken into two misaligned segments, a driver's hand fused to the wheel. All had passed my own\neye first.</li>\n<li><strong>The differences pass caught what the gate never mentions.</strong> In one rally panel the yellow car sat\nahead of the white, contradicting the brief. Every score on that panel was fine.</li>\n<li><strong>An intentional annotation reads as a defect.</strong> The gate flagged the small in-frame panel numeral as\n\"an unwanted watermark\" on every single panel, depressing scores by a design decision. Worth knowing\nbefore treating per-panel scores as absolute.</li>\n<li><strong>A composed board must stay inside a 0.4 to 2.5 aspect ratio.</strong> Two 1080p runs failed outright on a\nfour-by-two grid of 16:9 panels (3.56). Three-by-three (1.78) passed. Only the job record's <code>hint</code>\nnames the range.</li>\n<li><strong>Some panel flaws do not reach the video.</strong> The staff sequence was the worst-scoring board of the\nthree, flagged five times for hands merging into wood and staffs bending, and it still delivered a\nclean 24 seconds with rigid staffs and four distinct hands at the bind. Prop geometry gets re-derived;\nburned-in graphics and plan errors do not. That distinction now sits in the reference, because it\ndecides how many repair rounds a flaw class deserves.</li>\n</ul>\n<p>Also measured: the actual spend for the whole PR came to about 26k CU, against a running estimate of\n41k that had been accumulated from per-call arithmetic rather than read from <code>usage</code>. Read the meter.</p>\n<h2>What the plan-only validation found</h2>\n<p>A clean-room agent, given only the installed skill and a 24-second eight-shot fight brief, produced an\n85-call plan and followed every rule this PR added without prompting: light board, diegetic audio with\nno instrument named, the 2 fps sweep, the 0.4 to 2.5 board ratio (noting correctly that it only binds\nwhen the board is actually passed), per-panel gating, collection before generation, <code>jobs_wait</code> with\n<code>pending_job_ids</code>, discovery instead of an asserted model id, and <code>aspectRatio</code> omitted in\nfirst/last-frame mode. It flagged eight uncertainties rather than guessing.</p>\n<p>It also found that the brief was impossible, which no one on this side had noticed. <code>SKILL.md</code> routes\ndiscrete shots to the chained lane, but <code>duration</code> accepts only -1 or 4 to 30, so eight chained shots\noccupy at least 32 seconds while the scripted lane will not honor eight cuts in 24. The worked example\ncompounded it by scripting twelve shots across 24 seconds, two seconds each. Six defects came out of\nit, all fixed:</p>\n<ul>\n<li><strong>The duration floor was never stated</strong>, so the lane's cost arithmetic invited impossible plans. Now\nin the body and spelled out with the numbers in the chained-lane reference.</li>\n<li><strong>The size ladder and hold-the-framing contradicted each other.</strong> Both sides of a chained cut are the\nsame frame, so shot size cannot change at a join. The agent called this the hardest decision in the\ntask and resolved it by inference. Now reconciled explicitly.</li>\n<li><strong><code>video-prompt.md</code> read as lane-neutral</strong> while two of its seven sections only apply to the scripted\nlane, and the chained lane had no prompt shape at all. Now labeled, with the five sections that carry\nover named.</li>\n<li><strong>Step 8's key frames had no home in the chained lane</strong>, which has no <code>referenceImages</code> slot. The\nboundary stills are the key frames; said so.</li>\n<li><strong>The board was the approval artifact in one file and \"the first thing to drop\" in another</strong>, which\nbit immediately because the brief asked for storyboard sign-off.</li>\n<li><strong>No step elicited the creative brief</strong>, though the plate is load-bearing everywhere after it.</li>\n</ul>\n<p>Two things were deliberately not filed as defects. The agent named <code>numImages</code> where the real parameter\nis <code>numOutputs</code>, but the skill never discusses image-model parameters and the plan had already\nscheduled the schema read that would have caught it. And all six named siblings were absent from the\nclean room, which is the known install-resolution gap: the invitation sentence fired correctly and the\nagent flagged the affected phase instead of inventing a model id.</p>\n<p>The lesson for this file: five paid video runs found the register and arrow rules, and one free\nplan-only run found a correctness bug that would have sent a user down an impossible path. Run the\ncheap test first.</p>\n<h2>Felt cuts are not what either lane delivers</h2>\n<p>Two clean-room agents, given different briefs, both asked for cuts a viewer could feel, both chose the\nchained lane because <code>SKILL.md</code> routed discrete shots there, and both then extrapolated the same\nuntested workaround: render each boundary twice, one still per framing, and treat the pair as a match\ncut. Neither had documentation for it. Both invented it from the same sentence, which said a size\nchange at a join \"would need two different stills of one pose\" as a reason it could not work. A\nsentence that reliably produces the inference it was arguing against is a defect whatever it intended.</p>\n<p>The measurements say neither lane gives editorially distinct cuts. The scripted lane converted eleven\nscripted handoffs into 0, 2, 2 and 6 detected hard cuts across four runs, rendering the rest as camera\nmoves. The chained lane makes both sides of a join the same frame, so the coverage size cannot differ\nacross it and the join reads as continuous motion by construction.</p>\n<p>So the skill now says what it delivers in the Overview rather than leaving it to be derived after a\nlane is chosen, stops describing the paired-stills mechanism, and routes the want to where it actually\nworks: deliver the continuous take and cut it at your own points with <code>scenario-video-editing</code>. The\nmomentum is real because it was one take, the cuts are real because an editor made them, the cut points\nare exact and free to move, and nothing needs re-rendering.</p>\n<p>The paired-stills idea was deliberately not priced as an option. It is unmeasured, it doubles the still\nbudget, it cannot be checked without a paid video run, and recommending an untested technique inside a\nskill whose whole purpose is to stop an agent guessing would undercut the rest of the file. Two\nindependent agents converging on it is a reason to close the inference off, not to bless it.</p>\n<p>The <code>description</code> was left alone on purpose. Someone who wants six felt cuts should still trigger this\nskill, because it now carries the answer for them; narrowing the keywords would hide the guidance from\nexactly the reader who needs it.</p>\n<h2>The six plan-only defects, and one caught by verification</h2>\n<p>A third clean-room run on a scripted-lane brief (the first two both chose the chained lane, so the\nscripted half had never been read cold) came back a pass with six non-blocking items. All six are fixed:\nthe compose canvas fields now say to read them off <code>model_schema_get</code>, <code>generateAudio</code>'s default-on is\nstated so sound needs no flag, the audio check is named as eyes and ears with the warning that a useless\nrun looks like a good one, the grid guidance generalizes, the caps are read before the script is\nwritten, and the deliverable statement moved to the Overview's third sentence.</p>\n<p>That run also confirmed the earlier fixes in a way a repeat brief could not have: the duration floor was\nused in reverse, to disqualify the chained lane at \"4 s floor x 6 shots = 24 s &gt; 20 s\", and the audio\nlane scoping held with <code>generateAudio: true</code> in a scripted prompt and no confusion with the chained\nlane's picture-only rule.</p>\n<p>The fix for the grid item was wrong on the first attempt, and how it was caught is the part worth\nkeeping. Replacing two correct examples with a general rule produced \"three columns is the most that\nstays inside the range\", which is false: four by three is 2.37 and sits inside it. Worse, the rule was\nunsound in both directions, since \"at most three columns\" permits three by two at 2.67, which the same\nsentence names as a failure, and it forbids four by three, the natural layout for this skill's own\n12-panel worked example. A five-panel board obeying it lands on 3x2 (2.67) or 1x5 (0.356) and fails\neither way.</p>\n<p>Nineteen candidate findings came out of four verification passes over the diff, run with distinct\nlenses: lost content, internal contradiction, whether each fix closes its defect, and mechanical\ncompliance. Seventeen were rejected under adversarial re-check, including two that attacked the same\ngrid paragraph for having wrong numbers, which it did not. The two that survived were the two that\ncorrectly identified the rule rather than the arithmetic as the error. Both proposed stating the formula,\nwhich is what the file now does.</p>\n<p>The lesson is narrower than \"verify more\". Replacing correct-but-narrow examples with a general rule is\nthe single riskiest edit in a reference file, because a confidently stated wrong rule is worse than the\nvague text it replaced, and it reads as more authoritative. Two attacks on the canvas-fields fix were\nalso rejected here on solid evidence, one verifier checking the live schema and another the sibling\n<code>scenario-video-assembly</code> skill, both confirming <code>canvasWidth</code> and <code>canvasHeight</code> are real. A harness\nthat rejects seventeen of nineteen findings is doing its job in both directions.</p>\n<h2>Open questions</h2>\n<ul>\n<li>How reliably a single-panel reshoot holds the other panels. Verified once: with the approved board\npassed as a third reference and only panel 9's clause changed, panel 9 was corrected and the other\neleven panels came back unchanged, labels included. One trial is not a guarantee.</li>\n<li>Whether the register finding generalizes to non-photoreal deliveries: an animation-style board for an\nanimation-style delivery should follow the same logic, untested.</li>\n<li>Which of run D's three changes suppresses the markings. Undetermined by design. One run separates\nthe concept art from the other two.</li>\n<li>Where the line falls between a board light enough to stay a plan and one heavy enough to be copied.\nOnly the two extremes have been measured.</li>\n</ul>\n","files":[{"path":"README.md","sizeBytes":27106,"isText":true},{"path":"references/board-craft.md","sizeBytes":10095,"isText":true},{"path":"references/chained-lane.md","sizeBytes":5848,"isText":true},{"path":"references/video-prompt.md","sizeBytes":6597,"isText":true},{"path":"SKILL.md","sizeBytes":10834,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-17T09:11:30.56604Z","sha256":"DA774EBBD9223136D08EA73937D5499382E1BC4D7DFD440C240FF7CB4BEE87D1","sizeBytes":25934},"review":null,"source":{"repositoryUrl":"https://github.com/scenario-labs/skills","path":"skills/scenario-seedance-storyboard","license":"MIT","commit":"dc592af7139ffacfe8fdae7dc7efa80f4dd09be3","subtreeSha":"117725194432530A39F669985CA0584C0BC4D91A8524CB47C743277C90C24F71","lastSyncedAt":"2026-10-17T09:10:46.286688Z"},"reviewedAt":"2026-10-17T09:12:23.609217Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/scenario-labs/skills/tree/main/skills/scenario-seedance-storyboard"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install scenario-labs-skills@llmmart"},{"target":"git","command":"git clone https://github.com/scenario-labs/skills.git"}]}