comic-storyboard-creator
SkillDev toolsPhase-1 comic-author step — turn a LOCKED, user-approved outline into the page-first storyboard that IS the authoring source of truth: a fixed page order BEFORE any prose, the MOTIF STATE TABLE (the master per-panel continuity ledger), a fixed 9-field per-panel spec, and one deduped canonical asset contract. Decompose beats→pages→panels, 抽卡 K page/panel-order lineages by feasibility, then fill every panel one unit at a time. Writes a storyboard_spec + a motif_ledger (read by comic-continuity-audit) + N panel_spec nodes. Use when the user says "做分镜", "storyboard", "排页", "panel spec", "分镜稿", or the outline layer is locked and approved and you need the per-panel authoring layer the thin comic-author SOP defers to. Two-stage under the N1 contract: a PROVISIONAL structural gate pass on draft assets now, the FINAL asset-resolution validation after the asset layer locks.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the comic-storyboard-creator skill
What this skill tells your AI
The instructions your AI receives, as published by wanshuiyin/aris-movie-director in skills/comic-storyboard-creator/SKILL.md and read by ahel’s review.
The storyboard step of the comic-author suite: take a LOCKED, user-approved
outline_spec and produce the artifact that IS the authoring source of
truth — a fixed page order authored as its own section BEFORE any per-panel prose, the MOTIF STATE
TABLE (the master per-panel ledger that pins every continuity variable for all panels before any bake),
a fixed 9-field per-panel spec, and one deduped canonical asset contract. This is the deep
layer the thin comic-author orchestrator SOP defers to; it ports the rigor of aris_movie's
movie-storyboard-creator (抽卡 lineages → score → gate) and -v4 (locked-inputs precondition → beat→panel
budget → deterministic spec) onto stills, and it emits the panel_spec fields the downstream
comic-blueprint-author and comic-director
consume. The downstream baking spiral is not this skill's job — this is pure authoring + ledger.
Two-stage role (the N1 contract): this layer's gate runs TWICE. Right after the outline locks, this skill authors the storyboard and runs
--gate storyboardas a PROVISIONAL structural pass — the storyboard MAY reference draft (declared-but-unlocked) assets;panel_assets_referenceableis unscorable, is leftnull, and the fuser SKIPs it (nolockedflip yet). Then, after the asset layer has locked everything and OUTLINE_FINAL_LOCK has re-confirmed the outline, the FINAL asset-resolution validation re-runs--gate storyboardwith all four dims scorable and flips the storyboard tolocked. The hard locked-asset barrier stays downstream, before blueprint authoring (comic-authorsteps 6a–7).
Cardinal lesson baked in as a gate, not prose: decompose beats→pages→panels and 抽卡 K orderings by feasibility, then fill ONE panel at a time — never batch-author-then-look. The MOTIF STATE TABLE is the concrete guard: it pre-commits a per-dimension-per-panel ground truth (mug heat / executor bounce / Tok|yo evidence / DDL spine / exact_parse / claim_delta) with machine-checkable global invariants (DDL monotonic never-rewind; bounce S02 = the film's ONLY MAX; REJECT↔ACCEPT mirror), so the audit reads intent off a table instead of inferring it.
locked+approved outline_spec ─▶ ① PRECONDITION (refuse if outline unlocked / unapproved; draft assets OK here)
▼
② DECOMPOSE beats → pages → panels (beat→panel budget arithmetic)
▼
③ 抽卡 K page/panel-ORDER lineages (Codex xhigh) → score(feasibility/fidelity/novelty) → keep
▼
④ PAGE ORDER FIRST (a fixed section, page-type + L/R world per page, BEFORE prose)
▼
⑤ MOTIF STATE TABLE (master ledger; monotonic DDL; bounce-uniqueness; mirror locks)
▼
⑥ PER-PANEL 9-FIELD SPEC (one unit at a time; DONE panels locked; baked-vs-gate contract)
▼
⑦ CONSOLIDATE ASSET_REQUESTS (one canonical owner per token; naming 铁律)
▼
⑧ EMIT storyboard_spec + motif_ledger + N panel_spec (+ continuity_constraint)
▼
⑨ GATE ×2: PROVISIONAL structural pass now → (assets lock + OUTLINE_FINAL_LOCK)
→ FINAL asset-resolution pass flips `locked`
Constants
-
抽卡 K (lineages of page/panel ordering) —
K_LITE=3,K_BALANCED=6(default),K_MAX=8,K_BEAST=12(ported verbatim frommovie-storyboard-creator). Effort tier governs count of orderings, not depth. -
FEASIBILITY_FLOOR = 5 — a lineage scoring
feasibility < 5/10is dropped (e.g. it needs arbitrary un-gateable text rendering, exact UI replication, or face identity it can't anchor). If<2survive, re-prompt once on the same Codex thread; still<2→ tell the user to lower--effortor relax the banlist. Never fall back to a Claude-generated lineage (violates reviewer independence). -
REVIEWER = the Codex CLI at
model_reasoning_effort: xhighfor the 抽卡 brainstorm + the cross-layer gate — it pins NO model (it follows the local codex config, currentlygpt-5.6-sol); Geminiauto-gemini-3where a second family is needed. Never downgrade the effort tier (reviewer-routing). -
PAGE_TYPES (authoring vocabulary) =
{cover, single, 2-up, vertical-3, grid2x2, big-frame, endcard}. These are NOT the compiled IR's page types —schemas/comic.schema.jsonpages[].typeenum is{cover, single, grid, grid2x2, feature, finale}— so the compiler MUST project them (an unmapped token FAILS jsonschema):storyboard token compiles to pages[].typecover/single(incl. full-bleed) /grid2x2same name 2-up/vertical-3gridbig-framefeatureendcardthe PRIOR page's closing.image— the shipped-reference convention: comic_m3_audit compiles S22's endcard intoP_B12.closing.image(18 pages ship, not a 19th endcard page).finalestays a legal enum value for a standalone end page, butclosing.imageis THE convention to copy. -
WORLDS =
{warm, dark-cyber, seam, starfield}(human = warm, ARIS = dark-cyber, explicitseamat hand-off/payoff,starfieldfor the wiki/finale) — the two-world palette grammar inherited from the outline. -
MOTIF_TABLE_COLUMNS (per panel, verbatim) =
Panel | <motif-A> | DDL | <motif-B> | exact_parse | claim_delta | bounce— for the worked example:Panel | Mug | DDL | Tok|yo | exact_parse | claim_delta | bounce. The two metric columns (exact_parse,claim_delta) never co-mingle (different metrics, different value sets). -
PANEL_TEMPLATE = the fixed 9 fields (+ title anchor):
text_mode/content_blueprint/expected_literals/scene/characters/bubbles{zh,en}/side_narration{zh,en,trait}/motifs/asset_requests. No free prose outside these fields. (cover/finale panels addsafe_zones/endcardfields.) -
OUTPUT =
story/STORYBOARD_DRAFT.md(the human artifact) + wiki nodes (storyboard:<slug>,motif:<slug>,panel:<slug>× N, optionalcont:<slug>). Versioned peroutput-versioning.
Input contract — locked + approved upstream (refuse otherwise)
This skill is pure authoring + ledger, and it operates ONLY on converged upstream (convergence is the
upstream gates' job, per acceptance-gate):
- Refuse (HALT, point at the offending node) if the
outline_specis notstatus: "locked", OR it lacks the explicit user-approval stamp (the user-first gate — never proceed without a recorded✅ APPROVED by user <date>). Whitelisted assets may still be draft/declared at the PROVISIONAL pass — that is the N1 two-stage contract; an unlocked asset only blocks the FINAL asset-resolution validation (and everything downstream of it). - Asset-id whitelist is SACRED. Every panel may reference asset names ONLY from the outline's
character_asset_ids/scene_asset_ids/prop_asset_idsplus assets you newly request asasset_requests. Never free-describe an asset inline. If a panel needs an asset that doesn't exist yet, add it toasset_requests(which reopens the asset layer) — do not invent it silently. - Consumed outline fields:
narrative_beats[],beat_table(the 6-column table: Beat / Panels / layout / world / content+台词 gist / ARIS-feature-as-story-cost),motif_arcs(the per-shot continuity values),design_constraint(the dual-identity),title/logline/tagline.
Procedure (followable, one unit at a time — never batch)
① Precondition check
Load the outline_spec. Verify status == "locked" AND the user-approval stamp is present. (Whitelisted
assets may still be draft — locked is the FINAL pass's demand, not an authoring precondition; N1 two-stage.)
On any failure → HALT with the precise offending node id so the orchestrator routes
back to the outline layer. Record provenance in the header: source outline id, the prior
cross-model verdict it survived (real example: codex critique returned REVISE; "全部 fix 落地"), and the
✅ APPROVED by user <date> line.
② Decompose beats → pages → panels (budget arithmetic)
For each outline beat, read its layout token to set its page type and per-page panel count, then assign
shot/panel ids. Compute the page budget: a beat tagged vertical-3 owns 3 panels on one page; 2-up owns 2;
grid2x2 owns a recap page; single/full-bleed/endcard own 1. The centerpiece beat may expand
(real: B08 went 4 panels → 5 single-read pages, adding a NEW S12a audit-entry panel, with the 2×2 kept
ONLY as a recap/hero page). Clamp the global total to the project's tier window; if oversize, collapse the
longest multi-panel beat first; if undersize, split the beat with the most slack. Every panel must land on
exactly one page with a stable page id (P00_cover, P01_b02, …, P03_end).
③ 抽卡 K page/panel-order lineages (Codex xhigh), score, keep
Pass file paths only (the locked outline, the style bible, the wiki banlist of prior failed orderings) to
the Codex CLI at xhigh (no model pin — local codex config) — reviewer independence: Codex forms its own
reading, never gets your summary. Demand
K (= the tier constant) alternative page/panel orderings of the same beat set, each differing on ≥2 of:
page-rhythm axis (cover/2-up/grid/vertical-3/big-frame mix) · cast-presence axis (which panels show the
duo vs solo) · world-alternation axis (warm/dark/seam sequencing) · reading-order axis. Score each lineage
0–10 on Feasibility (lower if it needs un-gateable arbitrary text / exact UI replication / face identity),
Brief-fidelity (does it preserve the locked beat boundaries + the dual-identity), Novelty-vs-banlist
(penalize ≥0.6 Jaccard overlap with a prior failed ordering). Drop any lineage with feasibility < 5.
Promote the top survivor to the active page order; keep the rest as candidate notes (failed orderings become
banlist memory so the next run never re-proposes them). The 抽卡 here is over orderings, not panel content —
panel content is filled deterministically in ⑥.
④ PAGE ORDER FIRST (its own fixed section, before any prose)
Author the chosen ordering as a separate, fixed section that comes BEFORE per-panel prose (the
page_order field of the storyboard_spec). Assign each panel to its stable page id + page TYPE + per-page
L/R world. End with an explicit TOTALS line: panel count · page count · how many NEW bakes vs reused DONE
images. This section is the authority the compiler and the gate check the eventual comic.json against.
⑤ Author the MOTIF STATE TABLE (master ledger, before per-panel prose)
Author the MOTIF STATE TABLE as the single source of truth for the continuity dimensions across all
panels, before writing any per-panel prose. One row per panel; the columns are MOTIF_TABLE_COLUMNS.
Encode every machine-checkable invariant directly in the table + its conventions block:
- A motif column that is a thermometer (the worked example's
Mug): track ONLY the continuity-bearing instance (theML RESEARCHmotif mug:hottwo steam wisps = temperature origin →fadingone thin wisp →coldno steam + milk skin, a B01↔S20 bookend = "the hardest continuity constraint"). Disambiguate motif-vs-env: any look-alike that is just an environment prop (the</>mug) is taggedenvand is NOT tracked — this is the absence ≠ drift / design-aware gate rule made concrete (a naive holistic gate would false-flag it). - DDL = MONOTONIC, NEVER REWIND. The countdown is non-increasing across the ENTIRE film. Write the exact
sequence in the conventions block (real:
T-24:00:00 → 19:42 → 19:42 → 18:55 → 18:40 → 18:30 → 17:46 → 17:02 → 16:21 → 16:05 → 05:12 → 02:58 → 02:41 → 01:57 → 00:42 → 00:27(submitted)). Two consecutive equal values are allowed (a "same-instant rhyme"); an increase is a hard veto. If any draft value would rewind, fix it inline and annotate the fix (real:S06 DDL T-15:27 → T-18:40purely so18:40 > S07's 18:30). - Two metric columns that NEVER co-mingle.
exact_parsecarries{0.60, 0.71, 0.66, 0.78, 0.89};claim_deltacarries{+6.2, +1.4}. They are different metrics; writing one into the other's column is a veto. (Real: S10 showsexact_parse 0.71→0.66whileclaim_deltastays—; S14 showsclaim_delta +6.2→+1.4whileexact_parsestays—.) - bounce = the wordless emotion thermometer with a UNIQUENESS invariant.
bounce = MAXappears exactly once (real:S02 是全片唯一 MAX). Every later high is annotated "below S02". After the fall, NO new peak is allowed — a post-fall celebration must be written as arrested (real:S12a = attempted celebration, ARRESTED before becoming a jump, the codex fix that removed an earlier "MAX" there). The arc closes at the smallest bounce (real:S21 = smallest bounce, the mirror landing of S02). - MIRROR LOCKS (paired non-adjacent constraints the table also pins):
REJECT card ↔ ACCEPT card= exact same diagonal stamp geometry/angle (real: S11 ↔ S16, both from the shared verdict-card geometry, the audit hinge);S02 unique-MAX bounce ↔ S21 smallest bounce; a labeled wiki map ↔ its wordless twin share node coordinates programmatically derived from one JSON (real: S16b ↔ S22 fromwiki_starmap_nodes_v1.json, 禁目测 — no eyeballing).
⑥ Per-panel 9-field spec, in comic page order (ONE panel at a time)
Walk the page order and author each panel in the fixed template — finish one panel fully before starting the next (this is the "never batch-generate-then-look" lesson at authoring time). Each panel carries:
- title + beat + page-type + world (the header anchor).
text_mode∈{baked, html}—baked= the image model renders the in-frame text;html= the panel is a pure scene and ALL text lives in the HTML overlay (zero glyphs in the image).content_blueprint— which canonical SVG asset is instantiated + the exact literal layout (e.g. "fromassets/ddl_widget_template_v1.svginstantiateT-24:00:00, amber on a navy widget, screen-corner").expected_literals— the blind-transcribable tokens that will be gated (see the contract below).scene— the staged environment (density target, books/props, the warm/dark world rendered).characters— who is present + their motif-table state (bounce, pose); note who is absent and why.bubbles{zh,en}— speaker + style + bilingual line. Skill names NEVER appear in a bubble or in-frame (铁律) — they live only inside_narration.side_narration{zh,en,trait}— first sentence = what happened; second = the ARIS capability bound to a story cost; thetraittag names the bound skill. (The 侧栏讲解铁律 inherited from the outline.)motifs— restate that panel's row of the MOTIF STATE TABLE (must agree with ⑤ exactly).asset_requests— the canonical asset names this panel consumes (whitelist only).
In the human STORYBOARD_DRAFT.md, a DONE / reused panel's row carries ONLY status + side_narration +
motifs (as baked) — locked, never retro-edited (real: S12–S15, baked images promoted from a grid to single
pages; their square crops stay in the existing 2×2 recap; no regeneration). A DONE panel that is edited is a
hard veto. The wiki panel_spec node is NOT reduced: validate_wiki.py PAYLOAD_REQUIRED["panel_spec"]
unconditionally requires all 13 fields for EVERY panel_spec (no DONE exemption), so a DONE/reused panel's
panel_spec.payload must still carry every field, holding its prior locked values unchanged (never retro-edited).
The reduced 3-field form is a STORYBOARD_DRAFT.md convenience only.
⑦ Enforce the baked-vs-gate contract per panel
expected_literals holds ONLY the salient, large, blind-transcribable tokens; everything visible-but-not-
gated is explicitly excluded in writing:
- Sub-threshold chips out of contract — real: the S09
Tok|yochip is sized ≤1.5% frame height, "below blind-review transcription threshold", NOT inexpected_literals(it is a deliberate foreshadow, no callout, no arrow); it becomes hero/gated only at S10. - Skill names NEVER in-frame (铁律) — they are side-narration only.
- ASCII-only gating — real: S20 gates
SUBMITTED; the✓is decorative non-ASCII and is out of contract. - A deliberately sub-gate token must never be smuggled into
expected_literals(hard veto).
⑧ Consolidate ASSET_REQUESTS (one canonical owner per token; naming 铁律)
Collect every panel's asset_requests into ONE canonical, deduped, authoritative list. Apply the naming
铁律: declare all draft-era name variants void and map them to the single canonical name; pin one
parametric source per recurring motif (real: ONE ddl_widget_template_v1.svg is the sole render source for
the entire 18-instance countdown timeline; ONE stamp_family_v1.svg for ALL verdict stamps — no two stamp
sets, and it must match the already-baked S12–S15 stamps; ONE wiki_starmap_nodes_v1.json is the single truth
source shared by the labeled map S16b and its wordless twin S22). Flag P0 blockers (real:
researcher_chibi_canonical_ref_v001.png missing — only the duo had a canonical ref) and enumerate
zero-new-work reuse (DONE panels, the existing recap page, S01's baked image reused as a set-continuity
condition ref for S20/S21 same-room/same-desk/same-camera).
⑨ Emit nodes, attach the review, THEN invoke the gate (two steps — never cold)
Write the wiki nodes (§ below) and append the author edges. The storyboard gate is a score-FUSER: it
walks reviews edges into the target, fuses the pre-existing review:* score-nodes, and HARD-FAILS if
zero are attached ("no reviews — gate is a score-fuser, not a reviewer"). So before invoking it:
- Which pass is this? (the N1 two-stage ordering). The PROVISIONAL pass runs right after authoring:
every panel asset ref must be whitelisted or filed as a complete
asset_request(DECLARED), butlockedis NOT required —panel_assets_referenceable(resolves AND locked) is unscorable, is leftnull, and the fuser SKIPs it (the provisional verdict rides on the other three structural dims; nolockedflip yet). The FINAL pass runs only after the asset layer has driven every requested asset tolockedAND OUTLINE_FINAL_LOCK has re-confirmed the outline (comic-authorsteps 5–6b): now all four dims are scorable, an un-locked ref hard-vetoes on_unresolved_asset_refs, and anapproveverdict flips the storyboard tolocked. - Pre-gate review (fan-out → persist). The storyboard gate is structural, CC-only (no visual
reviewer — no pixels exist yet), so the cross-model lens here is the structural validator run, not a
panel of model families. Compute the structural facts (below; at the PROVISIONAL pass
panel_assets_referenceablestaysnull— see ⑨.0) and persist them as areviewnode:node_id: review:<slug>,payload {target_node_id: "storyboard:<slug>", reviewer, gate_kind: "storyboard", review_scores:{panel_assets_referenceable, global_policies_valid, panel_count_band_aligned, continuity_chain_well_formed}}, with areviewsedgereview:<slug> → storyboard:<slug>. - Invoke the fuser.
python3/ callcomic-cross-layer-gate<storyboard:slug> --gate storyboardto fuse + adjudicate against the EXACT predicate below. On anapproveverdict (the gate's verdict set is{approve, revise}) at the FINAL pass, the gate flipsstoryboard_spec.status→locked; a PROVISIONAL-passapproveleaves itunder_review(⑨.0), andrevisesets/keepsunder_reviewat either pass. (Canon ⑥ FLIP:lockedis a STATUS reached by the advance verdict, never a verdict name.) The gate (a different model family) — never this authoring agent — acquits (artifact-integrity). Reviewer routing for any model-family fan-out: Claude (one lens) ‖ Codex CLIxhigh(no model pin — local codex config, currentlygpt-5.6-sol) ‖ Geminiauto-gemini-3, file paths only (reviewer-routing).
EXACT gate (storyboard) — quote comic-cross-layer-gate --gate storyboard
This is not this skill's rubric to define — comic-cross-layer-gate
is the SOLE gate authority, and --gate storyboard is STRUCTURAL, CC-only (no visual reviewer; no pixels
yet). Verdict set {approve, revise}. Under the N1 contract it is invoked TWICE (provisional → final; the
which-pass rules are ⑨.0). The text below is quoted verbatim from that gate so this skill authors
to the real predicate — if the two ever diverge, the gate wins.
Scored dimensions = exactly FOUR; each scored 0–5; ADVANCE (APPROVE) iff ALL FOUR ≥ 4. These four are
file-system facts the gate computes, not reviewer opinion:
panel_assets_referenceable— every asset ref in each panel resolves AND isstatus: locked. Scored at the FINAL pass only; at the PROVISIONAL pass it is leftnull/SKIPped and the declared-check (whitelisted or completeasset_request) applies instead — see ⑨.0 for the two-stage ordering.global_policies_valid—global_policiesfields match expected (text-mode rules present; mirror-lock policy present; page-order authority declared).panel_count_band_aligned— panels-per-page in band per target tier{mvp:(2,2), demo:(4,6), longform:(10,12)}(in-range = 5, off-by-one = 3, further = ≤2), AND theTOTALSline reconciles (Σ panels-per-page == panel count; NEW + reused == total).continuity_chain_well_formed— the MOTIF STATE TABLE has one row per panel; links have no dangling / out-of-order / cycle; every per-panelmotifsfield agrees with its table row.
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 61
- Forks
- 4
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
comic-storyboard-creator- Source
- github.com/wanshuiyin/aris-movie-director