Install
$ agentstack add skill-wanshuiyin-aris-movie-director-comic-storyboard-creator ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
comic-storyboard-creator — the Page-First Storyboard + Master Continuity Ledger (Phase 1, step S6)
The storyboard step of the [comic-author](../comic-author/SKILL.md) suite: take a LOCKED, user-approved [outline_spec](../comic-outline-creator/SKILL.md) 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-2 the 150-line comic-author SOP defers to references/; 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](../comic-blueprint-author/SKILL.md) and [comic-director](../comic-director/SKILL.md) consume. The downstream baking spiral is not this skill's job — this is pure authoring + ledger.
> 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 / exactparse / claimdelta) 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 / any asset unlocked)
▼
② 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) → cross-layer gate
Constants
- 抽卡 K (lineages of page/panel ordering) —
K_LITE=3,K_BALANCED=6(default),K_MAX=8,K_BEAST=12
(ported verbatim from movie-storyboard-creator). Effort tier governs count of orderings, not depth.
- FEASIBILITY_FLOOR = 5 — a lineage scoring
feasibility | DDL | | 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 add safe_zones/endcard fields.)
- OUTPUT =
story/STORYBOARD_DRAFT.md(the human artifact) + wiki nodes (storyboard:,motif:,
panel: × N, optional cont:). Versioned per [output-versioning](../../protocols/output-versioning.md).
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](../../protocols/acceptance-gate.md)):
- 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 to asset-library work without a recorded ✅ APPROVED by user ), OR any referenced asset node it whitelists is not locked.
- Asset-id whitelist is SACRED. Every panel may reference asset names ONLY from the outline's
character_asset_ids / scene_asset_ids / prop_asset_ids plus assets you newly request as asset_requests. Never free-describe an asset inline. If a panel needs an asset that doesn't exist yet, add it to asset_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 AND every asset it whitelists is locked. On any failure → HALT with the precise offending node id so the orchestrator routes back to the outline / asset 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 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 Codex gpt-5.5 xhigh — 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 mug) is tagged env and 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:40 purely so 18: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_delta carries {+6.2, +1.4}. They are different metrics; writing one into the other's column is a veto. (Real: S10 shows exact_parse 0.71→0.66 while claim_delta stays —; S14 shows claim_delta +6.2→+1.4 while exact_parse stays —.)
- 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 from wiki_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.
"from assets/ddl_widget_template_v1.svg instantiate T-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 in side_narration.
side_narration{zh,en,trait}— first sentence = what happened; second = the ARIS capability *bound to
a story cost*; the trait tag 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 panelspec (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 STORYBOARDDRAFT.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 in expected_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:
- Asset-lock precondition (ordering). A panel asset must be
status: lockedAT GATE TIME
(panel_assets_referenceable = resolves AND locked). If you filed any asset_requests, that REOPENS the asset layer — drive those assets through the asset gate to locked before running the storyboard gate. Never run --gate storyboard with an un-locked asset_request outstanding (it will hard-veto on _unresolved_asset_refs).
- 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 four structural facts (below) and persist them as a review node: node_id: review:, payload {target_node_id: "storyboard:", reviewer, gate_kind: "storyboard", review_scores:{panel_assets_referenceable, global_policies_valid, panel_count_band_aligned, continuity_chain_well_formed}}, with a reviews edge review: → storyboard:.
- Invoke the fuser.
python3/ call **[comic-cross-layer-gate](../comic-cross-layer-gate/SKILL.md)
--gate storyboard** to fuse + adjudicate against the EXACT predicate below. On an approve verdict (the gate's verdict set is {approve, revise}), the gate flips storyboard_spec.status → locked; on revise it sets/keeps under_review. (Canon ⑥ FLIP: locked is a STATUS reached by the advance verdict, never a verdict name.) The gate (a different model family) — never this authoring agent — acquits ([artifact-integrity](../../protocols/artifact-integrity.md)). Reviewer routing for any model-family fan-out: Claude (one lens) ‖ Codex gpt-5.5 xhigh ‖ Gemini auto-gemini-3, file paths only ([reviewer-routing](../../protocols/reviewer-routing.md)).
EXACT gate (storyboard) — quote [comic-cross-layer-gate](../comic-cross-layer-gate/SKILL.md) --gate storyboard
This is **not
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: wanshuiyin
- Source: wanshuiyin/ARIS-Movie-Director
- License: MIT
- Homepage: https://wanshuiyin.github.io/ARIS-Movie-Director/comic/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.