# Comic Storyboard Creator

> Phase-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 ev…

- **Type:** Skill
- **Install:** `agentstack add skill-wanshuiyin-aris-movie-director-comic-storyboard-creator`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [wanshuiyin](https://agentstack.voostack.com/s/wanshuiyin)
- **Installs:** 0
- **Category:** [AI & ML](https://agentstack.voostack.com/c/ai-and-ml)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [wanshuiyin](https://github.com/wanshuiyin)
- **Source:** https://github.com/wanshuiyin/ARIS-Movie-Director/tree/main/skills/comic-storyboard-creator
- **Website:** https://wanshuiyin.github.io/ARIS-Movie-Director/comic/

## Install

```sh
agentstack add skill-wanshuiyin-aris-movie-director-comic-storyboard-creator
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## 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 / 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.

```text
  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_spec` is not `status: "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_parse` carries `{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 = MAX` appears **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:
1. **title + beat + page-type + world** (the header anchor).
2. **`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).
3. **`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").
4. **`expected_literals`** — the blind-transcribable tokens that **will be gated** (see the contract below).
5. **`scene`** — the staged environment (density target, books/props, the warm/dark world rendered).
6. **`characters`** — who is present + their motif-table state (bounce, pose); note who is absent and why.
7. **`bubbles{zh,en}`** — speaker + style + bilingual line. **Skill names NEVER appear in a bubble or in-frame**
   (铁律) — they live only in `side_narration`.
8. **`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.)
9. **`motifs`** — restate that panel's row of the MOTIF STATE TABLE (must agree with ⑤ exactly).
10. **`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|yo` chip 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:

0. **Asset-lock precondition (ordering).** A panel asset must be `status: locked` AT 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`).
1. **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:`.
2. **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](https://github.com/wanshuiyin)
- **Source:** [wanshuiyin/ARIS-Movie-Director](https://github.com/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.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-wanshuiyin-aris-movie-director-comic-storyboard-creator
- Seller: https://agentstack.voostack.com/s/wanshuiyin
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
