$npx -y skills add wanshuiyin/ARIS-Movie-Director --skill comic-directorPhase 2/3 of a movie — bake + cross-model-verify a movie from an authored comic.json. Per frame: render the content-SVG blueprint, bake via the agent mcp__codex__codex sidecar, gate with a 3-reviewer cross-model panel (narrative [currently the codex CLI] ‖ Gemini visual ‖ Codex v
| 1 | # comic-director — the Audited Spiral + Release (Phase 2/3) |
| 2 | |
| 3 | The **middle + right of Figure 1**: take an authored `comic.json` (produced by the |
| 4 | [`comic-author`](../comic-author/SKILL.md) skill, Phase 1) and turn it into baked frames + a clickable |
| 5 | viewer, through the audited spiral. Per frame: render a deterministic content-SVG blueprint → bake a |
| 6 | pixel-art frame (agent `mcp__codex__codex` sidecar) → a 3-reviewer cross-model `panel_gate` → keep / retry → page assembly → |
| 7 | projection. The movie twin of `method-figure`'s render half. (Image-based today; video-based is next.) |
| 8 | |
| 9 | ## Input contract — `comic.json` (authored upstream) |
| 10 | The contract boundary is **`comic.json` + the assets it references** (content-SVG blueprints, identity refs, |
| 11 | `ART_BIBLE.md`) — authored by [`comic-author`](../comic-author/SKILL.md). This skill is **render + verify**: |
| 12 | - It **never invents** a number or a cast — faithfulness is a deterministic token-diff over reviewers who |
| 13 | never see the expected values; identity is judged against the ref the author supplied (cast-aware). |
| 14 | - It writes back **only** `image_path` / `active_attempt_id` / `wiki_node_id` (+ the wiki trace) on KEEP. |
| 15 | - **The generator family (Codex image_gen) can NOT self-acquit.** A KEEP needs the token-diff clean **and** |
| 16 | the cross-model visual panel (Gemini + Codex) to pass. The calling agent (Claude) gives the final |
| 17 | structural sign-off. |
| 18 | |
| 19 | Full IR spec: [`../../docs/comic-json.md`](../../docs/comic-json.md) / |
| 20 | [`../../schemas/comic.schema.json`](../../schemas/comic.schema.json). |
| 21 | |
| 22 | ## Run it (`scripts/run_comic.py` — agent-driven bake, CLI gates) |
| 23 | A pure-stdlib **faithful port** of `packages/core/spiral_engine.js`'s movie branch. The cross-model **gates** |
| 24 | (Gemini + Codex vision) still shell the `gemini` / `codex` CLIs directly. The **BAKE** is performed by the |
| 25 | skill **agent** via the **`mcp__codex__codex`** MCP tool through `--bake-mode=agent` (the default): the core |
| 26 | emits a deterministic bake-request sidecar (prompt + absolute ref paths + exact out_path), the agent calls |
| 27 | `mcp__codex__codex` (`sandbox: workspace-write`, `model: gpt-5.5`, `config: {model_reasoning_effort: xhigh, include_image_gen_tool: true}`, |
| 28 | `cwd: <project>`), and the core verifies the explicit out_path. (`codex exec` is RETIRED for real bakes — it |
| 29 | forced a hand-drawn SVG/struct+zlib fallback; `--bake-mode=exec` RAISES if it ever reaches a real bake. See |
| 30 | `docs/spiral-runtime.md`.) |
| 31 | ```bash |
| 32 | python3 skills/comic-director/scripts/run_comic.py \ |
| 33 | --project examples/comic_m3_audit --page P02_b08 --panels S12,S13,S14,S15 \ |
| 34 | [--bake-lang zh] [--finalize] [--dry-run] [--skip-assembly] \ |
| 35 | [--gemini-cmd "python3 cli/gemini_agy_shim.py"] [--gemini-family google] |
| 36 | ``` |
| 37 | - `--dry-run` validates + prints each frame's concrete bake prompt (no image_gen) — **run this first**; it's |
| 38 | also how `comic-author` confirms Phase 1 is correct. |
| 39 | - `--finalize` rebuilds the single-file viewer (`packages/viewer/build_comic.py`) **only if the run is |
| 40 | shippable** (nothing escalated/throttled/flagged-for-human; assembly accepted). |
| 41 | - `--gemini-cmd` (default: the legacy `gemini` CLI) — the argv prefix shelled for the google-family reviewer |
| 42 | slot (the `--model auto-gemini-3 -p <prompt>` tail is appended). With the legacy CLI deprecated upstream |
| 43 | (`IneligibleTierError`, 2026-07), pass `--gemini-cmd "python3 cli/gemini_agy_shim.py"` — the shipped shim |
| 44 | translates the old interface to Antigravity's `agy` and **pins a Gemini model** (Antigravity also serves |
| 45 | Claude/GPT-OSS; the slot must stay google-family for cross-model quorum honesty). |
| 46 | - `--gemini-family` (default `google`) — the provenance family recorded in the wiki for whatever |
| 47 | `--gemini-cmd` actually routes to. It must stay **non-`openai`** (the visual quorum needs a second family); |
| 48 | record honestly, never re-label. |
| 49 | - Needs the **`codex` CLI** + a **google-family reviewer** (legacy `gemini` CLI, or Antigravity via |
| 50 | `--gemini-cmd` + the shim) on PATH + headless Chrome (to rasterize the content-SVG blueprint). |
| 51 | Reuses `skills/method-figure/scripts/pickup_image.py`. |
| 52 | |
| 53 | It prints a JSON run-report (`kept`, `flagged_for_human`, `needs_human`, `shippable`, `throttled`, |
| 54 | `escalated`, `assembly`, `attempts_per_panel`). Engine semantics it ports (caps 4/panel + 6/run, the |
| 55 | deterministic verdict, anatomy single-vote veto, throttle → fresh-run): [`../../docs/spiral-runtime.md`](../../docs/spiral-runtime.md). |
| 56 | |
| 57 | ## Bake seam contract (agent ↔ core) — `--bake-mode=agent` |
| 58 | The bake |