Korean version:
SKILL.ko.md
Turn one script or synopsis into a self-contained HTML film storyboard whose panels are drawn from numbers, checked for continuity, and printed as A4 landscape.
<output_language>
Write every user-facing string in Korean: scene headings, action lines, intent, the shot list, the panel notes, and the hand-off message. Keep the source's dialogue language unless the user asks for a translation. JSON keys, enumeration values, file names, and error and warning codes stay in their original form, and a camera name printed on a panel always carries its number and its Korean term.
</output_language>
- Start from the source. Read the script and split it into beats before any camera decision; this skill bundles no script parser, so the reading is the agent's work.
- Derive every panel from five numbers — camera height, pitch, direction, roll, and lens — plus the shot size. A name such as low angle or close-up is printed from those numbers and is never an input.
- Draw line art that survives a thumbnail: boxes rather than stick lines, front markers only on the hemisphere that faces the camera, a hair mass on the back at every angle, and hidden-line removal so a limb behind the torso is not drawn through it.
- Generate each panel and floor-plan picture under this package's own image contract with the exact compiled prompt and no reference image, then inspect the returned picture before embedding it; when no image route is available or no picture passes, keep the line art and save the prompt for a later run.
- Print a camera line with numbers and Korean terms in a fixed order, so the panel can be shot from the page without asking what "low" meant.
- Lint continuity before delivery: the 180° axis, the 30° rule, eyeline matching, screen direction, jump cuts, and overloaded moves. Repair the geometry, or record the break with a method and a reason.
- Deliver one folder that opens from disk with no network:
index.html,storyboard.json,shot-list.md, andmanifest.json, with A4 landscape print and a floor plan per scene. - Keep the renderer dependency-free. No library, no CDN, no web font, no remote request, and no image file outside the document.
<routing_rule>
Use storyboard-maker when the deliverable is a film storyboard: drawn panels for a script, a synopsis, or a scene list, with camera values, movement notation, and continuity checks.
Do not activate when:
- the deliverable is motion — an animatic, a video, a GIF, or a frame sequence — because this skill produces static panels only
- the user wants a photograph, a screenshot, or a recognizable real person in a panel — out of scope; panel pictures are drawn from this script's own staging and characters
- the user wants a UI wireframe, a comic page, or a presentation slide — the output shape is a film panel with a camera line
- the user wants an existing film's frames or boards reproduced or traced — refuse that part (see
<forbidden>) and build the board from this script's own staging - the user wants a script parser for another script format — the agent reads the script and writes the document
This skill is self-contained. It owns the input schema, the renderer asset, the continuity rules, the validation loop, the image generation contract, and the decision to keep line art. No other skill needs to be installed: without an image capability the board is still complete as line art.
</routing_rule>
<instruction_contract>
| Field | Contract |
|---|---|
| Intent | After one intake pass, deliver .hyper/storyboard-maker/<slug>/ holding index.html (the studio asset with the document embedded), storyboard.json, shot-list.md, and manifest.json. |
| Scope | Story analysis, beat and shot planning, blocking and axis, camera values, the input document, optional panel pictures, the rendered board, and its report. No motion, no file export other than the browser print. |
| Authority | User request and repository instructions > the script's own text > this package's defaults (16:9, a 35 mm sensor, three panels per A4 landscape page, a 1.70 m character) > any external storyboard guide. |
| Evidence | Every panel traces to a beat in the source; every camera value is a number in the document, never an adjective; every break is repaired or recorded with a non-empty crossing.reason; every embedded picture passed the references/panel-art.md inspection and carries generated provenance; the report object, not the page's appearance, is the evidence. |
| Tools | A file writer for the document and the delivery folder. A browser with DOM and CSS for the board, the report, and print; without one, a node or bun runtime for validate, lint, and render. An observed image generation capability for pictures, used with the compiled prompt and nothing attached; without one, the line art and the saved prompt are the delivery. No network. |
| Loop | Write → render → read getReport() → fix errors, then repair or record warnings. At most two rounds, then deliver with the remaining codes named. |
| Output | Korean board text, index.html, storyboard.json, shot-list.md, manifest.json, and shots[].image data URIs for every panel that carries a picture. Machine-readable: the getReport() object and the StoryboardCore results. |
| Verification | window.storyboardStudio.getReport(), or the browserless core run, plus the validation checklist and the per-panel image inspection when pictures were generated. On a package change, the corpus validator, the authoring validator with --require-self-containment, and bun run --cwd scripts verify. |
| Stop condition | Ask the intake items once, then work without re-asking. Deliver after the checklist and a report with zero errors; stop and name the missing input when a fact the board needs cannot be grounded. Never claim a panel, a print, or a manifest that was not produced. |
</instruction_contract>
<activation_examples>
Positive:
- "Make a movie storyboard from this script. Format it for A4 landscape printing."
- "Draw a six-shot storyboard for the kitchen conversation scene, including camera height and angle values."
- "Using this plot, create a line-art storyboard for each scene that includes a floor plan and a 180-degree check."
- "Turn this synopsis into a line-art storyboard with camera values, movement arrows, and an A4 landscape print."
- "Pull a shot list for this scene and draw the panels in 16:9. Include one low angle."
- "Draw these script panels in black-and-white comic style. Composition follows the camera values." — activate; pictures are generated from the computed composition when the runtime can, and line art with saved prompts is the fallback.
Negative:
- "Make an animatic video from this script." → out of scope (motion output, not panels)
- "Make a photo with a storyboard feel." → out of scope (photographic frame, not a drawn panel)
- "Put this actor's face exactly as it is into the panel." → out of scope (a recognizable real person)
- "Draw it exactly like this movie's storyboard." → out of scope (reproducing an existing film's frames)
- "Draw a wireframe of this app screen." → out of scope (UI wireframe, no camera line)
Boundary:
- "Make a storyboard." — ask for the source, the aspect, and the scope in one message; activate once a script or synopsis is in hand.
- "I need about 20 shots." — activate; number shots in tens and let the beat sheet, not the count, decide the scenes.
- "You can just wing the camera angles." — activate; the angles are still numbers, and the stated defaults (
16:9, 35 mm, pitch 0) fill what the brief leaves open. - "Give me a print-ready PDF too." — activate; a PDF comes only from the browser print dialog, and the skill generates no PDF file.
- "I'll draw the pictures myself, so just pull a shot list for me." — activate; deliver the shot table and the document, and say the panels were not drawn.
</activation_examples>
<trigger_conditions>
Activate when the request names a storyboard, a shot board, a conti, a shot list with drawn panels, camera angles for a scene, continuity checking for a sequence, or an A4 printable board for a script, and the deliverable is drawn panels plus camera values. Also activate when the user supplies a script, a synopsis, or a scene list and asks how to cover it shot by shot.
Do not activate for motion output, photographic frames, a recognizable real person's likeness, UI wireframes, or a request to reproduce an existing film's boards; handle those as the routing_rule states.
</trigger_conditions>
<skill_architecture>
| Part | Role | Load condition |
|---|---|---|
SKILL.md |
Trigger, contract, workflow, safety, validation | Always |
rules/workflow.md |
The end-to-end run: intake, beats, shot list, blocking, camera values, JSON, injection, report, repair, delivery | Before starting a run |
rules/continuity.md |
The 180° axis, three-character staging, the four bridges and none, the 30° rule, eyeline matching, screen direction, recorded breaks |
While blocking a scene and whenever a continuity warning fires |
rules/validation.md |
The pre-delivery checklist, the response to each code, the loop limit, the package-change checks | Before delivery and on a package change |
references/output-contract.md |
Input schema, derived geometry, output layout, StoryboardCore and window.storyboardStudio, codes, the browserless run |
Before building the document or calling the core |
references/camera-and-framing.md |
The five camera values, pitch and height geometry, shot-size ranges, angle and direction names, the focal-length table, the horizon rule, Korean terms | While choosing camera values |
references/notation-and-drawing.md |
Arrow answers and vocabulary, frame-in-frame moves, line hierarchy, panel notes, transitions, mannequin construction, readability tests | While reviewing or defending a panel |
references/image-generation.md |
Capability observation, route choice, the immutable brief with no reference image, the two-attempt limit, the browser-driven chat route, persistence under images/, result states |
Before generating any panel or floor-plan picture |
references/panel-art.md |
Art style, per-panel flow, inspection, embedding and provenance, floor-plan picture, fallback, safety | Before generating a panel picture or choosing the line-art fallback |
assets/storyboard-studio.html |
The renderer: core functions, gallery, report, floor plans, print CSS | To render, report, and print the board |
assets/sample-storyboard.json |
A two-scene, eight-shot worked example with one recorded crossing | When the document shape is unclear or on a first run |
</skill_architecture>
<loop_policy>
The run has one bounded loop: write or edit the document, render, read getReport(), fix errors, and repair or record warnings. One round is one edit pass, one re-render, and one re-read of the report. At most two rounds; after the second, deliver with the remaining warning codes named. An unresolved error stops delivery and is never delivered with a note. JUMP_CUT, PRIMARY_MOVE_OVERLOAD, and WIDE_LENS_FACE are repaired, not recorded. There is no loop that continues until the board looks good, and no self-grading loop that skips the report. Picture generation has its own limit, at most two attempts per brief (references/image-generation.md), and does not reset the board loop.
</loop_policy>
<language_and_translation_default>
Deliver in Korean by default: scene headings, action lines, intent, the shot list, and the hand-off note. Dialogue stays in the language the source gives it unless the user asks for a translation. Keep JSON keys, enumeration values, codes, file names, and camera names in their original form. The package's Markdown is maintained as English/Korean pairs; read only one language version per run.
</language_and_translation_default>
<reference_routing>
- Before starting a run, read
rules/workflow.md. - Before building the document or calling the core, or when the schema shape is unclear, read
references/output-contract.md. - While choosing camera values, read
references/camera-and-framing.md. - While blocking a scene, or when a continuity warning appears, read
rules/continuity.md. - While reviewing arrows, labels, line weight, or the mannequin, read
references/notation-and-drawing.md. - Before generating any picture, read
references/image-generation.mdfor how to produce it andreferences/panel-art.mdfor what it must show; when deciding to keep the line art, readreferences/panel-art.md. - Before delivery and whenever this package changes, read
rules/validation.md. - When the document shape is unclear or a first board is needed, open
assets/sample-storyboard.jsonandassets/storyboard-studio.html.
</reference_routing>
<support_file_read_order>
Read only one language version per run. Paths are relative to this installed skill directory, never a hard-coded checkout or plugin cache. File reads are explicit actions, not automatic includes.
- Read
rules/workflow.mdbefore starting the run. - Read
references/output-contract.mdbefore building the document. - Read
references/camera-and-framing.mdwhile choosing camera values. - Read
rules/continuity.mdwhile blocking and when a continuity code appears. - Read
references/notation-and-drawing.mdwhile reviewing panels. - Use
assets/sample-storyboard.jsonwhen the document shape is unclear. - Copy
assets/storyboard-studio.htmltoindex.htmland embed the document; do not edit the core, the styles, or the print rules. - Read
references/image-generation.mdandreferences/panel-art.mdbefore generating a panel or floor-plan picture or choosing the line-art fallback. - Read
assets/evals/storyboard-maker-cases.jsonlwhen changing the trigger, the workflow, or the output behavior. - Read
rules/validation.mdbefore delivery and whenever this package changes.
</support_file_read_order>
Two rules run through every step: build the board from this script's own space, never from another film's frames, and write everything the board shows in Korean.
| Step | Work | Output |
|---|---|---|
| 1. Intake | Ask once, in one message, only for what the brief leaves open: the source and whether it is final, the aspect, the scope and the expected panel count, the characters and their heights, and the tone. State the defaults you will use (16:9, 35 mm, three panels per page). |
Confirmed brief |
| 2. Beat breakdown | Split the source into beats, one line each: what the audience learns, who wants what, where it happens. Group the beats into scenes with the script's heading and a number, and mark the turning beat of each scene. | Beat sheet |
| 3. Shot list | Turn each beat into one or more shots, number them in tens, and give each shot a size, a focus, and a reason. An insert takes the gap number, 15 between 10 and 20. |
Numbered shot list |
| 4. Scene blocking and axis | Place every character and prop on the floor plan in metres, give each character a facing and a pose, and declare the two ids that carry the axis or null. Check the camera side before drawing panels. |
Floor plan and axis |
| 5. Camera values and intent | Write size, focus, subjects, yawDeg, rollDeg, focalMm, and at most one of pitchDeg and heightM; add the move, the subject moves, the duration, the transition, and one sentence of intent. |
Numbers per shot |
| 6. Build the JSON | Assemble one document per references/output-contract.md §1. Every id resolves, no id repeats inside its scope, every value sits in its enumeration, and the file is written as storyboard.json first. |
storyboard.json |
| 7. Inject into the studio copy | Copy the studio asset to index.html and put the document in <script type="application/json" id="storyboard-doc">, escaping every </ as <\/. Change nothing else. |
index.html |
| 8. Panel images | For each shot, compile the brief with compilePanelPrompt() and keep it exact, then generate with that string alone under references/image-generation.md; attach no reference image of any kind, not the renderGuideSvg() guide, an earlier panel, a character sheet, a style image, or an external image. View the guide beside each returned picture during the inspection in references/panel-art.md and embed only a picture that passes every row; observe the capabilities, stay within two attempts per brief, and save every returned picture under images/. When no route is available, or the picture ends in prompt_saved or blocked, keep the line art and save the prompt. Each scene may also get a floor-plan picture from compileFloorPlanPrompt() under the same rules, stored as scenes[].planImage. Write the document with its pictures back to storyboard.json and re-inject it into index.html with the same <\/ escaping. |
shots[].image and a re-injected document, or a saved prompt |
| 9. Open in a browser and read the report | Read getReport(), not the page: errors stops the build, warnings badge the panels, info records expected states, intentional lists every shot that carries a crossing, bridge shots included, and the counts say what rendered. |
getReport() |
| 10. Fix errors and review warnings | Fix every error at its path; repair each warning, or record a line-related one with crossing. One round is one edit, one re-render, one re-read; at most two rounds. |
Clean or documented report |
| 11. Deliver | Write index.html, storyboard.json, shot-list.md, and manifest.json to .hyper/storyboard-maker/<slug>/, run the validation checklist, and name the folder, the counts, and every remaining code. |
Delivery folder |
When the source already carries a shot list with camera values, steps 1–5 shrink to confirming it; steps 6–11 always run.
- Ask the intake items in one message and await the reply; do not repeat answered items, and do not demand a shot list the user does not have.
- State the defaults in the same message:
16:9, a 35 mm sensor, three panels per A4 landscape page, character height 1.70 m when the source is silent. - Split the source into beats before choosing a camera, and let the beat sheet decide the scene count.
- Number shots in tens and place an insert at
15or25instead of renumbering the scene. - Give every shot a numeric
size,focus,yawDeg,rollDeg,focalMm,durationSec,transition, and a one-sentenceintent. - Provide at most one of
pitchDegandheightMper shot, and neither on apovor anOTSshot; useheightMwhen the camera has a physical position andpitchDegwhen the angle is the instruction. - Place every character and prop on the floor plan, and declare
axisas two ids ornullbefore judging any cut. - Keep every id resolvable and every enumeration value inside its list; the document is the single source of truth for the drawing.
- Report the shot size, angle, direction, lens, camera height, and
DUTCHonly when the roll is non-zero, in that fixed order, with the number before the Korean term. - Keep one primary move per panel, draw every arrow outside the subject, and label every arrow with the vocabulary.
- Generate each panel picture with the exact
compilePanelPrompt()string as its whole brief, and each floor-plan picture with the exactcompileFloorPlanPrompt()string, and no reference image of any kind, and embed the returned picture only after it passes every inspection row inreferences/panel-art.md. - Embed a picture as a data URI with
provenance: "generated"and the exact prompt; on fallback keep the line art and write the prompt intoshot-list.md. - Read the report object after every render, and re-render after every edit; a page can look finished while no panel exists.
- Repair line-related warnings or record them with
method,intentional: true, and a non-emptyreasonthat names the effect. - Deliver
manifest.jsonas thegetReport()object unchanged, and keep the rendered panel count equal to the document's shot count. - Keep the delivered copy identical to the asset except for the embedded document: the core script, the styles, and the
@page/break-insideprint rules stay untouched. - Say which check ran. A browser read, a browserless core run, and no run at all are three different claims.
- Depending on another skill being installed, naming another skill, or depending on any path outside this package.
- Attaching a reference image of any kind to the image invocation: the rasterized guide, an earlier panel, a character sheet, a style image, or an external image.
- An animatic, a video, a GIF, a frame sequence, or a PNG or PDF file written by the skill; a PDF comes only from the browser's print dialog.
- Presenting a generated panel as a photograph, a film frame, a production still, or a supplied picture; presenting a rendered line drawing as a photograph.
- A real person, a celebrity, or a recognizable likeness in a generated panel; the script's real-world names are rendered as fictional characters of the described build and wardrobe.
- Exceeding two attempts for one brief, or editing, paraphrasing, or re-translating the brief between attempts.
- Reproducing, tracing, or copying the frames, boards, or shot-for-shot staging of an existing film; the staging comes from this script.
- Vendoring a JavaScript library, loading a CDN script, fetching a web font, or making any network request from the delivered page.
- Bundling a script that runs the renderer; the core lives in the asset and is called in the browser or by a runtime one-liner.
- A joint, IK, drag, or viewport editor; a real-time camera control panel; a 3D scene view.
- A parser for a script format; the agent reads the script and writes the document.
- Editing the core script, the styles, or the print rules in the delivered copy, or shrinking
panelsPerPageto make a page fit. - Deleting a shot to silence a warning, or clamping an out-of-range number instead of correcting the value or the unit.
- Reporting a panel, a rendered board, a print, or a
manifest.jsonthat was not produced, or presenting an unverified board as checked. - Interpolating user text as HTML; the renderer uses text content and escapes every value, and no string in the document may carry markup.
- A
null,"N/A", or brace placeholder filling a field that carries no meaning; omit the field instead.
<runtime_fallback>
If no browser with a DOM is available, do not claim the board was seen. Execute the minimum contract and disclose the skipped step.
- Write
storyboard.jsonfirst, thenindex.htmlwith the document embedded and every</escaped as<\/. - Run the core with
nodeorbunexactly asreferences/output-contract.md§6 shows, pointed atstoryboard.jsonrather than the injected copy. Readvalidateandlintfrom the output: the commands exit non-zero only on a thrown exception, not on a document with errors. - Apply the loop to that output: fix errors, repair or record warnings, at most two rounds.
- Write
manifest.jsononly when that fallback run also executedrender(doc)and could count panels and scenes; otherwise deliver withoutmanifest.jsonand say the counts were not captured. - Image generation does not depend on the browser. When an image route is observed, run the panel-image step for each shot, compiling the brief with
compilePanelPrompt()from the same core and attaching no reference image; when none is, keep the line art and save each compiled prompt inshot-list.md. Never claim a picture that was not returned and inspected. - If neither a browser nor a JavaScript runtime exists, deliver
storyboard.json,shot-list.md, and the embeddedindex.html, with a one-line note that the report and the visual check were not captured. Never fabricate a report, a panel count, a print, or amanifest.json. - Never describe a panel's appearance that was not rendered, and never say the page prints correctly when the print dialog was not opened.
</runtime_fallback>
- Intake answered in one message, the defaults stated, and the delivery matches the chosen aspect and
panelsPerPage. - The source was read and split into beats; the shot list is numbered in tens and any insert sits at
15or25. - Every character and prop has a floor-plan position, and each scene declares
axisas two ids ornull. - Every shot carries numeric camera values, one of
pitchDegandheightM, and a one-sentenceintent; no name is used as an input. -
getReport()was read anderrorsis empty;panelsequals the document's shot count andscenesequals its scene count. - Remaining warnings are repaired, and every recorded break appears in
intentional[]withmethod,intentional, and a non-emptyreason. - Each panel's camera line carries size, angle with pitch and Korean name, direction, lens, camera height with height name, and
DUTCHonly when the roll is non-zero. - Line art passes the thumbnail silhouette test, front markers appear only on the camera-facing side, and the hair mass shows on a back view.
- At most one primary move per panel, every arrow outside the subject with a label, and no arrow across a face or a hand.
- Panel notes carry scene and shot, camera line, action, dialogue when it matters, sound, duration, and transition, with the transition belonging to the outgoing panel.
-
index.htmlis the asset plus the embedded document, with the core, the styles, the@pagelandscape rule, andbreak-inside: avoiduntouched. - Print was checked in the browser dialog when a browser was available; otherwise the note says it was not captured.
-
manifest.jsonis thegetReport()object unchanged. - Every embedded picture is a
data:image/...URI withprovenanceset togeneratedorsupplied, and no picture is described as a photograph, a film frame, or a production still. - Every picture was viewed at readable size beside the
renderGuideSvg()guide and passed the shot size, angle, view, facing side, no-text, and look-consistency rows. - No reference image of any kind was attached to an image invocation: no rasterized guide, earlier panel, character sheet, style image, or external image.
- At most two attempts were made per brief, each stored prompt is the compiled string unchanged, and every returned picture is saved under
images/with its record. - Every fallback panel is named by id in the hand-off, keeps its line art, and has its prompt marked
PROMPT SAVEDinshot-list.md. - No generated panel holds a real person, a celebrity, or a recognizable likeness, and no external image entered the pipeline.
- No network request, no remote
srcorhref, no web font, and no bundled script in the delivered folder; everyimage.srcis a data URI, not a URL or a file path. - No existing film's frames or boards were copied, traced, or followed shot for shot.
- Package change only: KO/EN parity holds, the corpus validator and the authoring validator with
--require-self-containmentpass, andbun run --cwd scripts verifypasses.
Sources
Checked 2026-11-03.
| Claim | Source |
|---|---|
| Storyboard panels built from scene, shot size, camera note, action, optional dialogue, and transition, with shot numbers in tens so an insert fits at 15 | https://storyboardart.org/storyboard-tutorials/storyboard-format-for-film/ |
| The 180° axis, eyeline matching, and the four bridging devices that let a scene change sides | https://storyboardart.org/storyboard-tutorials/continuity-for-storyboards/ |
| Arrow shapes and labels are the storyboard convention; no source fixes their line weight or colour | https://storyboardart.org/storyboard-tutorials/storyboard-arrows/ |
| Angle and direction terminology, and the disagreement between guides on where each angle starts | https://filmglossary.ccnmtl.columbia.edu/term/camera-angle/ |
| Perspective, field of view, and the relation between focal length, distance, and face exaggeration | https://www.edmundoptics.com/knowledge-center/application-notes/imaging/understanding-focal-length-and-field-of-view/ |
| The 30° rule as a convention with the axial cut as its deliberate exception | https://en.wikipedia.org/wiki/30-degree_rule |
A4 landscape printing and page breaks declared with @page and break-inside |
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@page |
| The five camera values, the framing ranges, the mannequin and front/back markers, and the line hierarchy of this package | references/camera-and-framing.md, references/notation-and-drawing.md |
| The schema, the report, the codes, and the browserless core run for this package | references/output-contract.md |
| The panel art style, the prompt call, the inspection rows, and the fallback for this package | references/panel-art.md |
| The image generation contract: capability observation, route, immutable brief without reference images, attempt limit, persistence, and result states | references/image-generation.md |
| The procedure, the continuity rules, and the delivery checklist for this package | rules/workflow.md, rules/continuity.md, rules/validation.md |