# Comic Outline Creator

> Phase-1 Layer-2 of a comic — turn a LOCKED skeleton (intent_spec + the pre-locked beat/shot list) into an approved outline_spec: a 6-column beat table that binds every ARIS capability to a STORY COST, plus the continuity-motif contract the storyboard layer will be held to. NOT free creation — editorial adaptation of a pre-locked skeleton via 3 parallel lenses → cross-model (Codex) synthesis → a d…

- **Type:** Skill
- **Install:** `agentstack add skill-wanshuiyin-aris-movie-director-comic-outline-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-outline-creator
- **Website:** https://wanshuiyin.github.io/ARIS-Movie-Director/comic/

## Install

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

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

## About

# comic-outline-creator — the Outline + Motif Contract (Phase 1, Layer 2)

The **middle-left of Figure 1**: take a locked `intent_spec` (+ the pre-locked beat/shot skeleton it
carries — OR, for an **idea-first comic with NO pre-locked skeleton**, the 3 lenses first **synthesize** a beat
skeleton from the intent's `logline` / `subjects` / `constraints` / `format`, then adapt it the same way; the
synthesized skeleton is recorded so the deltas-vs-skeleton discipline still applies) and produce a single
**approved `outline_spec`** — the 6-column beat table that drives the
storyboard, and the continuity-motif arcs that become the storyboard's checkable contract. This is the
comic twin of aris_movie's `movie-outline-creator` (a Layer-2 authoring-time **plan gate** before any
pixels), specialized for our image-comic route: the deliverable is a *plan*, never a frame.

Two things are simultaneously true, and the whole skill is built around them:
**(a)** the outline is NOT a free brainstorm — it is an **editorial adaptation of a pre-locked skeleton**
(N beats / M shots, beat boundaries fixed), so every candidate must self-report its **deltas vs the
skeleton**; **(b)** an unbounded "ARIS capability showcase" silently rots into a **product manual** unless
every capability is bound to a concrete **story cost** and skill-name tags are banned from the 画面. The
3-lens → Codex-synthesis → density-pass → user-approval loop turns (a) into a faithful, debated outline and
the 侧栏讲解铁律 + the gate catch (b) every round.

```text
  intent_spec (logline + tagline + dual-identity + LOCKED skeleton)
        │
        ▼  ① FAN-OUT: 3 parallel named lenses over the SAME skeleton (faithful ∥ comicnative ∥ clarity)
        │     each ends with a self-authored "through-line + deltas vs the skeleton" section
        ▼
  ② SYNTHESIZE — Codex (different model family) reconciles the 3 → OUTLINE v2
        ▼
  ③ DENSITY/DESIGN pass — Codex MAY restructure panel count (e.g. centerpiece 4→5 pages, +mid-act page)
        │     AUTHORS the 侧栏讲解铁律 (anti "product manual" guard)
        ▼
  ④ Emit the 6-column BEAT TABLE + the centerpiece sub-plan + the 5 motif arcs (exact per-shot values)
        ▼
  ⑤ READINESS gate (PRE-user, cross-model, blind to orchestrator prose) — scores ONLY the author-controllable
        │   dims; EXCLUDES user_decision_record + the unresolved-questions veto (those are not yet satisfiable).
        │   Two-step (never cold): write review:* nodes + `reviews` edges → THEN comic-cross-layer-gate  --gate outline
        ▼ readiness:advance
  ⑥ USER APPROVAL = HARD GATE — present; record ✅ APPROVED + fill 已定决策 + EMPTY 待确认 block
        │   THEN the FINAL gate (now user_decision_record==5 IS satisfiable) → write outline_spec node (locked)
        │ revise ─▶ ② (bounded: MAX_OUTLINE_REVISIONS=3 → auto-abandon → failure_mode node)
        ▼ approve + signed
  outline_spec (locked) → SOURCE OF TRUTH for the storyboard layer
```

## Constants
- **LENS_COUNT** = **3, mandatory** (`faithful`, `comicnative`, `clarity`) — Tier-1 Workflow fan-out
  ([`fan-out-pattern`](../../protocols/fan-out-pattern.md)). Fewer than 3 lenses is a hard veto.
- **SYNTHESIZER** = `mcp__codex__codex`, `model_reasoning_effort: xhigh` — a **different model family** from
  the Claude lens authors. Codex both *reconciles* the 3 candidates AND runs the density/restructure pass;
  the outline layer is itself a cross-model artifact (executor ≠ reviewer, [`reviewer-independence`](../../protocols/reviewer-independence.md)).
- **GATE REVIEWERS** = `mcp__codex__codex` (gpt-5.5 xhigh) ‖ Gemini (`auto-gemini-3`, readability dims) — each
  sees ONLY `outline_spec.json` + `intent_spec.json` (the skeleton) + the lens files, never Claude's prose. They
  do **not** acquit; they each persist a `review:` node (payload `{target_node_id, reviewer, gate_kind:
  "outline", review_scores:{...}}`) with a `reviews` edge `review: → `, and the SOLE acquittal
  organ [`comic-cross-layer-gate`](../comic-cross-layer-gate/SKILL.md) `--gate outline` then **fuses** those
  score-nodes (D4: never invoke the gate cold — write the reviews FIRST, then call the gate).
- **THE GATE IS RUN TWICE** (the deadlock fix): a **READINESS** pass BEFORE user approval (scores only the
  author-controllable dims; the gate's own `user_decision_record == 5` floor and the unresolved-questions veto
  are **not yet satisfiable**, so the readiness reviewers explicitly omit them), then the **FINAL** pass AFTER
  the user signs + the `待确认` block is emptied (now `user_decision_record == 5` IS satisfiable). See §EXACT gate.
- **MAX_OUTLINE_REVISIONS** = 3, then auto-abandon → write a `failure_mode` node so a re-run must diverge. Its
  payload is **exactly** what `validate_wiki.py` PAYLOAD_REQUIRED demands for `failure_mode`: `{"layer":
  "outline", "affected_shot_ids": [], "active": true}`
  (node_id `fail:`, node_type `failure_mode`, status `active`). There is **NO `encoding_style` field** in
  the schema — carry the "a re-run must diverge" positive-invariant in `title` or a non-required note, never a
  fabricated required-looking key; the node must pass `cli/validate_wiki.py`.
- **MAX_DRAFT_ATTEMPTS** = 3 — schema-repair loop for the `outline_spec` node; on each fail, `codex-reply`
  quoting the validator errors **verbatim**. Never silently coerce a value to pass schema (change the
  narrative + document it, or surface to the user).
- **TARGET_PAGE_CEILING** (soft cap, exceed ⇒ Codex must justify in `rationale.beat_count_justification`,
  not a hard stop): `mvp=2`, `demo=6`, `longform=12` beats per tier (ported from `MAX_BEATS_PER_TIER`).
- **MIN_CAST_PER_BEAT** = every beat names **≥1 world/scene + the cast in it** (text-panel beats: a
  text-panel scene + its world). Ported from aris_movie's `MIN_ASSETS_PER_BEAT=2`; a structural check
  JSON-Schema can't express.
- **NODE** = `outline_spec` (this skill **reads** `intent_spec`, **writes** one `outline_spec`). See §Node.
- **APPROVAL IS NON-AUTOMATABLE** — the loop can DRIVE to a clean gate, but **only the user ACQUITS** the
  outline ([`acceptance-gate`](../../protocols/acceptance-gate.md)). Nothing proceeds to the storyboard
  layer until the user signs off, recorded inline.

## Input contract — what this skill reads, what it must not invent
The contract boundary is the **`intent_spec` node** ([§Node](#node)) — produced upstream by
`comic-intent-parser`, carrying: the **logline** (a single sentence whose climax may be an editorial
inversion — e.g. *"the climax is NOT winning — it's that ARIS didn't let itself off the hook"*); the
**tagline**; the **`dual_identity`** constraint (*"an emotional story of honest research + an ARIS capability
showcase"*) the whole debate optimizes against; and the **`source_skeleton`** — the pre-locked beat list
(`B01…BNN`), shot list (`S01…SMM`), and beat boundaries. **The skeleton is LOCKED; this skill ADAPTS it,
never re-derives it.**

This skill is **plan + verify**: it **never bakes a pixel** (image gen is `comic-director` / Phase 2-3) and
**never invents a beat boundary or a shot**. Adding a *page* (a density-pass split) is allowed and must be
accounted for in the deltas; **moving a beat boundary or dropping a shot is a delta that must be justified +
surfaced to the user**. If `intent.status != locked` → **REFUSE** (the upstream hand-off token is `locked` =
approved + frozen; an `under_review`/`draft` intent is not ready — re-run `comic-intent-parser` to its user
gate). If the skeleton is missing → **REFUSE and ESCALATE** (do not fabricate one).

## Procedure (an agent can execute this step by step)

### 0. Load + refuse-guard
Snapshot the `intent_spec` node. Pull cumulative wiki context: prior LOCKED assets (for reuse-over-invention),
and `failure_mode` nodes with `layer="outline"` (rejected/superseded outlines — a re-run must diverge from
them). Refuse if `intent.status != locked` (the upstream author-node hand-off token is `locked`, not `active`).
Checkpoint an `OUTLINE_STATE.json` (resumable —
[`resumable-runs`](../../protocols/resumable-runs.md)).

### 1. FAN-OUT — write 3 parallel candidate LENSES over the SAME locked skeleton
This is **Tier-1 Workflow fan-out** ([`fan-out-pattern`](../../protocols/fan-out-pattern.md)): three
independent passes, each a *named lens* over the identical skeleton, NOT three free drafts. Write each to its
own file (`story/outline_candidate_{faithful,comicnative,clarity}.md`). The three lenses are fixed:

- **`faithful`** — one-to-one fidelity: **M shots → M panels, no cut / merge / add**, beat boundaries
  `B01…BNN` preserved exactly. The conservative anchor (palette grammar + stamp mirrors live here).
- **`comicnative`** — comic-as-a-medium: **collapse runtime / motion shots into static-friendly pages**
  (in our run `S07-S09 → one 2×2 page`; `22 shots → 12 panels`); choose a `full-bleed / 2-up / 2×2`
  page-rhythm for scroll-reading.
- **`clarity`** — legibility for a **non-ML reader**: foreground the through-line so the headline number-arc
  (in our run `+6.2 → +1.4`) is readable via **one concrete physical prop** (the `Tok|yo` broken-JSON
  evidence) + **one wordless emotional gauge** (executor bounce height).

**Each candidate MUST end with a self-authored section: `## through-line + deltas vs the skeleton`** stating
exactly what it **merged / added / kept** and **why** (e.g. *"merged S07-S09 → one 2×2 page (motion is
redundant in a static page); kept all 13 beats; moved Tok|yo's first plant earlier to B06-S09 as a
re-pointable物证"*). A candidate with **no deltas section is a hard veto** — delta-accounting is the
discipline that proves it is an adaptation, not a guess.

### 2. SYNTHESIZE — Codex reconciles the 3 → OUTLINE v2
Call the **SYNTHESIZER** (different model family). Feed it the three lens files + the `intent_spec` +
`schemas/node_schema.json`'s `outline_spec` shape, inside a demarcated `=== EXTERNAL CONTEXT (advisory) ===`
fence; Claude's prose lives ONLY in that fence ([`reviewer-independence`](../../protocols/reviewer-independence.md)).
The synthesis takes the **best of each lens** — in our run: `faithful`'s two-world WARM/DARK palette grammar
+ the REJECT↔ACCEPT mirror, `comicnative`'s page-rhythm, `clarity`'s motif arcs + countdown spine. Emit
`{outline, rationale}`.

### 3. DENSITY / DESIGN pass — Codex MAY restructure panel count
Codex then does a **density / design pass** that may materially change panel count where the read demands it
(in our run: the centerpiece B08 went **4 panels → 5 single-read pages** by adding an "audit entry" panel,
with the 2×2 kept only as recap/hero/GitHub-screenshot; and a **new mid-act page** `B09.5` "research
star-map / wiki" was added *after the audit, before the paper* — flagged as *"the most powerful position"*;
panel count moved `22 → ~24`). This pass also **AUTHORS the 侧栏讲解铁律** (step 6). Adding pages is fine;
account for every one in the deltas.

### 4. Emit the 6-column BEAT TABLE
Emit the canonical table — **fixed columns, in this order**:

| Beat (zh/en) | Panels | 布局/layout | 世界/world | 内容 + 台词 gist | ARIS 特性（绑剧情）|

- **Beat** — bilingual id + name (`**B01 卧室·倒计时**`).
- **Panels** — the shot ids it OWNS (`S01` · `S07,S08,S09大` · `S12-15 + 新增 S12a`).
- **布局/layout** token ∈ {`full-bleed`, `split`, `2-up`, `1-panel`, `竖排3`, `5单张页(默认)/2×2 recap`}.
- **世界/world** token ∈ {`暖/WARM`, `暗/DARK`, `seam`, `暗·星空/starfield`} — human beats warm, ARIS beats
  dark-cyber, **explicit seam panels** at hand-off / payoff. (The warm/cold split is **by-design** — the
  downstream gate must never flag it as drift.)
- **内容 + 台词 gist** — panel action + baked-dialogue gist + a one-line side-narration (旁白).
- **ARIS 特性（绑剧情）** — the bound capability, **phrased as a STORY COST, never a feature name**
  (✅ `experiment-bridge（证据是暂定的）` · `honest re-run（自纠 overclaim）` · `auto-review-loop（对抗审）`;
  ❌ `experiment-audit`, `novelty-check` as bare tags). A bare feature name here is a hard veto.

### 5. Centerpiece sub-plan (the densest beat)
For the centerpiece beat, emit a sub-table `| 页/page | 画面/image | 侧栏（先讲发生了什么，再点能力）|` with the
verbatim **70/30 composition rule**:
> 每页：技术主画面 70% + 角色情绪 30%（右下角蓝 exec bounce 当体温计）+ 侧栏讲解。

Each row's 侧栏 puts the **event-sentence first**, then `· *trait: *` second (so the side-narration
reads as story, then footnotes the capability).

### 6. Embed VERBATIM the 侧栏讲解铁律 (the anti "product-manual" guard)
This block is **load-bearing** — copy it verbatim into the outline (it is what stops a capability showcase
from rotting into a product manual):
> 🎙️ 侧栏讲解铁律（防止"能力展示"变产品手册 —— codex）
> - 每条能力必须绑一个剧情代价：不写"ARIS has experiment-audit"，写"executor 的庆祝被审计打断，所以 ARIS 没撒谎"。
> - 侧栏第一句永远讲发生了什么；第二句才点能力名。
> - 每个能力都改变角色状态（bounce 高低 / 咖啡冷掉 / 红队介入 / claim 被降级）。
> - 画面里不堆 skill 名标签；skill 名只作侧栏小字或 hover/click metadata。

### 7. Lock the continuity-motif arcs AT OUTLINE TIME (exact per-shot values)
The outline **doubles as the continuity contract** — the storyboard's motif-state table and the
panel/assembly gates will be checked against these arcs, so they must carry **exact per-shot values now**.
Lock the 5 arcs (our run's values, as the worked pattern):
- **mug heat**: `STEAMING(S01) → fading(S03) → COLD(S20)` — B01/B12 bookend.
- **executor bounce** (wordless emotion thermometer): `MAX(S02) → HIGH(S09) → DROP(S11) → ZERO/SILENT(S12–S15,
  arc low point) → tempered-return(S16) → smallest-warm(S21)`. (Storyboard will add the uniqueness
  invariant *"S02 是全片唯一 MAX"*; no post-fall peak.)
- **Tok|yo broken-JSON evidence**: `born/first-plant(B06-S09) → smoking-gun(B08) → clean footnote(S17) →
  faint constellation star(S22)`.
- **DDL countdown spine**: `24:00:00 → ~19:00 → 00:42` — strictly **monotonically non-increasing** across
  the whole film (storyboard enforces; never rewinds).
- **REJECT(S11) ↔ ACCEPT(S16)**: deliberate **mirror stamps** so the centerpiece audit reads as the hinge
  between them.

### 8. Write the 6-column table + sub-plan + 铁律 + motif arcs to `story/OUTLINE_DRAFT.md`
Add a top-of-file `Logline + Tagline + 双重身份` block (mirroring the intent), an empty `## ✅ 已定决策` block,
and an `## ⚠️ 待你确认` block listing every open design question (e.g. *centerpiece 5-page split OK? new
mid-act wiki page OK? 侧栏铁律 OK?*).

### 9. READINESS gate — PRE-user, cross-model, blind (NOT the final gate)
This is the **author-controllable** gate, run **before** the user has decided anything. By construction the
artifact from step 8 has an **empty `已定决策`** + a **non-empty `⚠️ 待确认`** block and **no user sign-off** —
so the FINAL gate's `user_decision_record == 5` floor and its "open questions unresolved but advancing" veto
are **not yet satisfiable**. Applying the full conjunctive APPROVE rule here would deadlock a fresh agent
(stall, or fabricate a user approval). So the readiness pass scores **only** the dims the author controls and
**explicitly EXCLUDES** `user_decision_record` + the unresolved-questions veto (see §EXACT gate → READINESS).

Run it as a **two-step gate invocation (D4 — never call the gate cold)**:
1. **Fan out the GATE REVIEWERS** (Codex `gpt-5.5 xhigh` ‖ Gemini `auto-gemini-3`) on the files only
   (`outline_spec.json` + `intent_spec.json` + the lens files, inside the advisory fence — no orchestrator
   prose). **Persist EACH as a `review` node:** `node_id review:` (e.g. `review:outline_codex_r1`),
   node_type `review`, payload **required** `{target_node_id: , reviewer: "codex"|"gemini",
   gate_kind: "outline", review_scores:{skeleton_fidelity:…, delta_accounting:…, coverage:…,
   page_rhythm_readability:…, story_cost_binding:…, motif_contract_completeness:…, safety_ip:…}}` — and write a
   `reviews` edge `{src: review:, dst: , type: "reviews"}` (the gate walks `reviews` edges in;
   `reviewed_by` is the wrong direction and the fuser won't find it).
2. **THEN** invoke `comic-cross-layer-gate  --gate outline` to fuse the score-nodes + adjudicate.
   (Its own `--gate outline` floor — `min(coverage, identity_lock_feasibility, scene_lock_feasibilit

…

## 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-outline-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%.
