Repository
ARIS-Movie-Director
Hand a fuzzy story to your agent, wake up to a cross-model-audited movie π¬ β no forgotten facts, no frame signing off on itself.<br> π€ Agentic by design β planning Β· gating Β· cross Β· License MIT Β· Install via pip Β· Maintenance unmaintained
- License
- MIT
- The problem
- What ARIS-Movie-Director does about it
- A demo hides what was tried and thrown away.
- Every attempt / review / decision / failure-mode is written to the research-wiki β the reference run ships a 198-node trace you can read.
Specs
- The problemWhat ARIS-Movie-Director does about it
- A demo hides what was tried and thrown away.Every attempt / review / decision / failure-mode is written to the research-wiki β the reference run ships a 198-node trace you can read.
README
ARIS-Movie-Director
π δΈζ README Β· English
Hand a fuzzy story to your agent, wake up to a cross-model-audited movie π¬ β no forgotten facts, no frame signing off on itself.<br>
ποΈ Image-based today, video next.<br>
π€ Agentic by design β planning Β· gating Β· cross-model review on the agent; rendering on the diffusion model.
π Jump to β βΆ Watch the movie Β· β‘ Quick Start Β· π Workflows Β· π Make your own Β· π§© Layout Β· π¬ Community Β· π Cite Β· π€ Contributing
This is an agentic, long-horizon visual generation task: hand a fuzzy story to an agent and produce a whole
image-based movie (the reference run is a 19-scene / 24-frame story), not a single image. The concrete job is
fuzzy story β authored comic.json β audited panels β single-file viewer.
The hard part is faithfulness over time. Generated visual stories can look coherent while quietly changing
the facts β a chart rounds a number, a label mutates, a character's face drifts β and the run still ships,
because the same system that drew the frame is the one saying it looks fine. Across a long horizon, two failure
modes dominate:
- π§ Long-range forgetting β over many frames, identity, established facts, and earlier decisions drift.
- π£οΈ Linear, self-approved streaming β each frame is committed by the model that drew it, so mistakes compound unchecked.
π¬ Method at a glance. Read the figure left-to-right β the /movie-pipeline
agent workflow runs the full loop (author a source of truth β bake β cross-model gate): (1)
comic-author turns fuzzy intent into an authored comic.json + locked refs,
(2) comic-director runs the per-panel audited spiral β the multi-agent
debate (Codex narrative β Gemini + Codex visual blind-read β deterministic diff), logging every attempt / decision to the
research-wiki β (3) the pipeline assembles accepted panels into the
released viewer. The bottom-left failure is the whole rule: a beautiful but wrong literal still fails
(+6.2 expected vs +6.25 observed).
<sub>Figure 1 β from story intent to a verified movie, end-to-end (the loop described above). Full caption β</sub>
<details><summary><b>Figure 1 β stages, gates, and provenance</b> (click to expand)</summary>
(1) Authored source of truth β asset library Β· outline Β· storyboard compile into
comic.json(content_svg Β· expected_literals Β· identity_ref). (2) The audited spiral (per panel) β a content-SVG blueprint is baked by image_gen, then a 3-reviewer cross-modelpanel_gate(narrative β Gemini + Codex visual blind-transcribe β a deterministic token-diff Β· single-vote veto) returns a deterministicverdict: KEEP, or RETRY (β€4/panel) re-baked with the failed attempt's repair note; every attempt/review/decision/failure is logged to theresearch-wiki. (3) Assembly + release β a cast-awarepage_assembly_gate(repair drift β re-bake, β€6/run) ships PNG panels + a single-file HTML viewer. The punchline (bottom-left): a beautiful panel with a wrong number does not pass β+6.2expected vs+6.25observed fails the token-diff.This figure was itself produced by the same loop it depicts: a labeled blueprint conditioned Codex's native image-generation tool (driven by Codex GPT-5.5 xhigh β dated 2026-06 provenance; the image backend, called
gpt-image-2at the time, is not runtime-attested), then 4 generation rounds were ratified by the method-figure panel β Gemini + Codex blind-transcribe + a deterministiccontent_diff, then a Claude structural sign-off β until clean. The exact prompt sequence that baked this image (all 4 rounds + the cross-model critiques) is published verbatim as a reference:skills/method-figure/examples/method_figure/PROMPTS.md.
</details>
ARIS-Movie-Director treats every frame as an auditable artifact: author a deterministic comic.json first
(lock the expected_literals + identity refs before any pixels), let a generative model bake the look, then
require independent cross-model blind-transcription + a deterministic token-diff before a panel is kept.
Looks right β passes β a beautiful frame with a wrong literal is rejected. It answers the two failure modes
with two ideas from the ARIS series:
- π§ β a research-wiki β persistent, inspectable memory (locked refs Β·
expected_literalsΒ· every decision & failure as a node) that anchors late frames to early truth. - π£οΈβ multi-agent debate β independent cross-model reviewers blind-read every frame and a deterministic diff decides KEEP / RETRY, so no frame signs off on itself. Every attempt / decision lands in that wiki trace.
This first release is image-based β the movie is told in baked still frames you flip through. Video-based generation is what comes next; this is just the beginning.
βΆ Watch the image-based movie in your browser β flip through all 19 scenes of the cross-model-audited reference run.
<table><tr><td width="33%"><a href="https://wanshuiyin.github.io/ARIS-Movie-Director/comic/">
</a></td><td width="33%"><a href="https://wanshuiyin.github.io/ARIS-Movie-Director/comic/">
</a></td><td width="33%"><a href="https://wanshuiyin.github.io/ARIS-Movie-Director/comic/">
</a></td></tr></table>
<sub>A few frames from the reference movie β including the story's own integrity beat: a run that reported +6.2 improvement but really moved +1.4 (that's the plot, distinct from the figure's bake-time +6.2/+6.25 token-diff). Watch all 19 scenes β</sub>
<details><summary><b>β‘ What the audit gate actually catches</b> β the problem β mechanism table</summary>
| The problem | What ARIS-Movie-Director does about it |
|---|---|
| A panel can look right while changing a number, label, or code token. | comic.json locks the expected_literals; independent visual reviewers blind-transcribe what's actually in the pixels; an exact token-diff rejects any wrong or missing literal. |
| The model that baked an image can wave its own output through. | The bake never self-attests β independent visual models (a different family from the generator) read it blind, and a deterministic diff, not a model's opinion, decides KEEP / RETRY. |
| A frame can be baked with nothing to check it against. | Phase 1 authors content_svg Β· identity_ref Β· ART_BIBLE Β· expected_literals before pixels; a baked figure-panel with no gateable literals fails closed. |
| Character & style drift accumulate across a long sequence. | Locked identity refs + asset review (εΓ3) + a style bible + a cast-aware assembly gate check consistency while allowing intended scene/cast variation (absence β drift). |
| Retry loops go opaque or endless. | Per-panel attempts and assembly repairs are bounded; each failure carries a repair note; a non-convergent panel is flagged for a human, never silently shipped. |
| A demo hides what was tried and thrown away. | Every attempt / review / decision / failure-mode is written to the research-wiki β the reference run ships a 198-node trace you can read. |
</details>
<a id="quick-start"></a>
β‘ Quick Start
# 1 Β· get the repo + Python deps (everything but jsonschema is stdlib)
git clone https://github.com/wanshuiyin/ARIS-Movie-Director.git && cd ARIS-Movie-Director
python3 -m pip install -r requirements.txt
# 2 Β· external tools for the bake/review stages β install + authenticate, then verify:
# codex CLI Β· a google-family reviewer (legacy gemini CLI, or Antigravity via the shipped shim β see note) Β· headless Chrome / Chromium
python3 cli/preflight.py
There is no bundled installer β the skills/ are followed by your coding agent pointed at this repo; the deterministic CLIs run in-repo.
Google-family reviewer (2026-07): the legacy
geminiCLI is deprecated upstream (it now dies with
IneligibleTierErrorβ Gemini Code Assist for individuals is retired; Google's migration target is
Antigravity). Install Antigravity (agy) + log in, then pass
--gemini-cmd "python3 cli/gemini_agy_shim.py"torun_comic.py/run_spiral.pyβ the shipped shim
translates the oldgemini -p "@file β¦"reviewer interface toagyand pins a Gemini model
(Antigravity also serves Claude/GPT-OSS; the second-reviewer slot must stay google-family or the
cross-model quorum's provenance is corrupted). If your legacygeminiCLI still works, the default is
unchanged.
Run the two workflows β in a coding agent that has these skills (/β¦ is a slash-command agent workflow, not a shell binary):
> /movie-pipeline "a short film about an autonomous research run" # Workflow 1 β fuzzy idea β audited movie + viewer (pauses at intent + outline)
> /method-figure path/to/method_figure_brief.json # Workflow 2 β a brief β audited Figure-1 (render + verify β Claude sign-off)
See it first β zero setup, no API: βΆ open the hosted movie at https://wanshuiyin.github.io/ARIS-Movie-Director/comic/ (all 19 scenes / 24 frames). To rebuild it locally, see Workflow 1 β See the reference movie below.
<sub>Full map β fuzzy story β /movie-pipeline β comic.json + audited panels + outputs/index.html Β· method_figure_brief.json β /method-figure β figure.png + blueprint + trace</sub>
<a id="workflows"></a>
π Workflows
Two cross-model-audited workflows. Each is one slash-command agent workflow (the ARIS /research-pipeline
paradigm β an agent runs it, pausing at the human gates), with a deterministic CLI core you can also run
standalone (the part CI tests).
π¬ Workflow 1 Β· Movie pipeline β /movie-pipeline (fuzzy idea β audited movie)
Hand your agent a fuzzy story, approve two story gates, wake up to a baked, cross-model-audited movie + a clickable viewer:
> /movie-pipeline "a short film about an autonomous research run"
It chains comic-author (Phase 1 β author the source of truth) β the zero-credit
p0_proof gate β comic-director (Phase 2/3 β the audited spiral β viewer); the
orchestrator is movie-pipeline. It's an agent workflow, not a shell binary β
it needs a coding-agent runtime and pauses at intent + outline for your approval. (A step that doesn't fire is
safe β each layer consumes the prior LOCKED node, so a skipped step fails closed at the next gate, never shipping a
wrong frame.)
- π§ Intent β fuzzy idea β
intent_specΒ· stop for your approval - π¨ Style lock β the
ART_BIBLE.md+ lockedstyle_anchors (warm-lab / dark-cyber / starfield) - π§± Outline β 3-lens debate β synthesis β
outline_specΒ· stop for your approval - ποΈ Storyboard β pages Β· panels Β· the MOTIF STATE TABLE Β· consolidated
asset_requests - π§βπ¨ Assets β a single-source library, reviewed to
locked(εΓ3 same-round unanimity) - π Blueprints β a deterministic
content_svgper panel (no baked bubbles) - π§Ύ Prompts β exact bake prompts + verbatim
expected_literals(ζ¬θΏε·₯εε) - β
Compile β schema-valid
comic.json; the zero-creditp0_proofgate runs BEFORE any image credit - π₯ Spiral bake β render β agent
mcp__codex__codexsidecar bake (Codex's native image tool) β 3-reviewerpanel_gateβ keep / retry-same-panel βassembly_gate(re-bakes only NAMED drifting panels on cross-page drift) β viewer
π Flow β the skill chain (trace it top-to-bottom):
/movie-pipeline "fuzzy idea" one slash-command Β· agent-run, NOT a shell binary
β
βΌ comic-author drives these Phase-1 skills IN ORDER (they are not separate slash-commands):
comic-intent-parser
β β¨HUMAN APPROVE β intentβ©
β comic-style-bible-lock
β comic-outline-creator
β β¨HUMAN APPROVE β outlineβ©
β comic-storyboard-creator
β comic-asset-ref-generator β comic-asset-review-loop (εΓ3 unanimity β assets LOCKED)
β comic-blueprint-author β comic-panel-prompt-builder β comic-json-compiler
βββββββββββββββββ Phase 1 Β· comic-author β author the source of truth βββββββββββββββββ€
β
β β comic.json + locked assets + the author wiki trace
βΌ
comic-cross-layer-gate --gate p0_proof ββ P0 Β· ZERO-CREDIT proof β must pass before any image credit ββ€
β
βΌ comic-director β the audited spiral (run_comic.py | packages/core/spiral_engine.js)
per panel: content_svg β agent mcp__codex__codex sidecar bake β panel_gate
reviewers: Codex narrative β Gemini visual β Codex visual
β blind transcriptions β deterministic token-diff vs expected_literals
verdict β KEEP β page pool
β RETRY β€4 (re-bake the SAME panel + repair note)
β assembly_gate repair β€6 β re-bake ONLY the NAMED drifting panels when drift is localized (seed-anchored; never wipes prior good panels)
page assembly_gate β project accepted panels to comic.json β build_comic.py β outputs/index.html
βββββββββββββββββ Phase 2/3 Β· comic-director β audited spiral + viewer βββββββββββββββββ€
π research-wiki β reads the locked source nodes before each layer; writes every attempt / review /
decision / failure after each gate & bake (the inspectable audit trace).
π human-in-loop β intent + outline are HARD stops; a failed p0 / panel / assembly gate stops or
escalates; a non-convergent panel is flagged for you, never silently shipped.
The panel_gate (Phase 2/3, per panel): the bake is read by 3 independent reviewers β a narrative
reviewer (does it land the beat? β currently the codex CLI, recorded honestly as family openai; a
configurable --narrative-reviewer is planned, not yet implemented) β Gemini visual β Codex visual β who
blind-transcribe the pixels; a deterministic token-diff of observed_literals vs the authored
expected_literals decides KEEP / RETRY; content_corruption is a single-vote veto, both visual reviewers must
score, and no model self-acquits. Every attempt / reviewΓ3 / decision / failure is written to the research-wiki.
There is no live Claude CLI reviewer in this panel β Claude's role is the workflow-layer structural sign-off;
cross-family acquittal vs the Claude-authored prompts comes from Gemini + the deterministic fuse.
Phase 2/3 standalone (once comic.json exists). Only the zero-credit --dry-run below is genuinely
agent-free β that's the CI-tested slice:
python3 skills/comic-director/scripts/run_comic.py --project examples/<name> --page <PAGE> --panels S01,S02 --dry-run # zero credit, NO agent: prints bake prompts (the CI-tested slice)
python3 skills/comic-director/scripts/run_comic.py --project examples/<name> --page <PAGE> --panels S01,S02 --finalize # REAL bake β REQUIRES the agent sidecar SOP (see below)
run_comic.py is a subprocess port of packages/core/spiral_engine.js's movie
branch; it starts from an existing comic.json β it cannot start from a fuzzy idea. The deterministic CLI
core (validation, blueprint render, the token-diff gates) is what CI exercises, but the --finalize bake is
NOT agent-free: each panel bake is fulfilled by the agent-sidecar SOP β the
comic-director skill agent watches for the core's *.bakereq.json, calls
mcp__codex__codex (with config: {include_image_gen_tool: true, model_reasoning_effort: xhigh}) to fire the
native image tool, and writes back *.bakestatus.json. So a real movie bake needs a coding-agent runtime; only
--dry-run runs standalone. Model honesty: the bake payload pins model: gpt-5.5 + effort xhigh as a
single compatibility default (run_comic.get_bake_plan() β the exact plan the P0 certificate digests; a
config-driven override is planned, not yet implemented), while the codex CLI reviewers pin no model β they
follow your local codex config, at effort xhigh (--review-effort). Throttling: a
rate-limited bake stops cleanly with fresh_run_required β after cooldown launch a fresh run for the remaining
panels, do not resume cached state. Caps: β€4 attempts/panel Β· β€6 rollbacks/run Β· no concurrent bakes
(docs/spiral-runtime.md).
Authoring template: copy the Phase-1 author-node shapes from examples/comic_min_author/
when adding a new project. The flow diagram above is the canonical skill chain β the two human gates and the
fail-closed gates are shown there; prereqs (codex + gemini + headless Chrome) are in Quick Start.
βΆοΈ See the reference movie β what Workflow 1 produces (zero setup, no API)
python3 cli/validate_wiki.py examples/comic_m3_audit # verify the shipped trace β PASS (198 nodes, 26 edges)
python3 packages/viewer/build_comic.py examples/comic_m3_audit # (re)build the single-file viewer from comic.json + panels
open examples/comic_m3_audit/outputs/index.html
β¦or just open the hosted one: https://wanshuiyin.github.io/ARIS-Movie-Director/comic/ β all 19 scenes / 24 frames of the cross-model-audited reference run.
πΌοΈ Workflow 2 Β· Method figure β /method-figure (a brief β Figure-1)
One slash-command, /method-figure β give it a method_figure_brief.json
(the same brief paper-plan emits after its claims_matrix) and it runs the whole audited spiral to a signed-off
figure (Step-0 compile β render condition β sidecar bake via Codex's native image-generation tool β Gemini + Codex blind panel + content_diff β
retry until clean β Claude structural sign-off):
> /method-figure path/to/method_figure_brief.json
The deterministic core β Step-0 compile, blueprint validation, the condition render, and the content-diff
gate β is driven by one command, run_spiral.py. Its zero-credit slices (--p0-only / --dry-run) run with
no agent runtime; a real bake β Codex's native image-generation tool (image backend not runtime-attested) β REQUIRES the agent sidecar SOP (the
method-figure skill agent services the core's *.bakereq.json by calling
mcp__codex__codex with config: {include_image_gen_tool: true, model_reasoning_effort: xhigh}):
# OUR example brief bakes ARIS's own Figure 1 β swap in your own method_figure_brief.json
python3 skills/method-figure/scripts/run_spiral.py \
skills/method-figure/examples/method_figure/method_figure_brief.json \
--out-dir figures/method_figure/demo
# β figures/method_figure/demo/figure.png (the PANEL-CLEAN candidate, awaiting your structural sign-off)
# (+ blueprint.json + traceability.json + trace.jsonl of every round)
# the REAL bake above needs the agent sidecar (mcp__codex__codex servicing .bakereq.json) β NOT agent-free.
# first run? add --p0-only β that slice IS agent-free (zero image credits: validate + compile + render + lint).
# NOTE: --dry-run (also agent-free) still writes these files.
<details><summary>π flow β /method-figure (brief β audited render β sign-off)</summary>
(upstream β only if you have a paper; NOT part of /method-figure):
paper_to_brief.md β method_figure_brief.json agent-authored; claims / numbers copied VERBATIM
β
βΌ
/method-figure <method_figure_brief.json | blueprint.json> the skill = pure render + verify
run_spiral.py β the deterministic core (starts from a brief):
compile_brief.py (Step-0) β blueprint.json + traceability.json every node traces to a brief field β else FAIL-CLOSED
β validate_blueprint.py β render_condition.py labeled condition SVG β PNG
β agent mcp__codex__codex (workspace-write, config{xhigh}) β native image-gen bake fail-closed verifier, not a sandbox setting
β Gemini blind-transcribe β Codex blind-transcribe β content_diff.py deterministic vetoes
β RETRY β€4 (re-assert the locked labels) β Claude STRUCTURAL sign-off
β figure.png (+ blueprint.json + traceability.json + trace.jsonl of every round)
βββββββββββββββββ method-figure Β· audited render / verify spiral βββββββββββββββββ€
</details>
Step-0 is deterministic inside the skill β you never hand-write a blueprint or place coordinates; the identity
sheet resolves from the brief's identity_refs[].path (no separate --identity); every node is
traceability-checked back to a brief field (un-traceable β fail-closed). No model self-acquits β the bake is
ratified by Gemini + Codex blind reads + a deterministic content_diff, then a separate Claude structural
sign-off. Needs the codex + gemini CLIs + headless Chrome (python3 cli/preflight.py).
Only have a paper, no brief yet? Author the brief FIRST β point your coding agent (e.g. the
ARIS main project) at your paper via
paper_to_brief.md(claims/numbers verbatim) β then
/method-figureit. Power-user: already have a hand-tuned blueprint?run_spiral.py blueprint.json --identity sheet.png --out-dir β¦ --from-blueprintruns the legacy path. The worked 4-round convergence (the
exact prompts) is inPROMPTS.md.
π‘οΈ Why the two gates differ (both correct, by design)
The movie panel_gate is a 3-reviewer panel (narrative β currently the codex CLI β Gemini visual β Codex visual) β a story
panel must land its beat AND be visually on-model. The method-figure panel is Gemini + Codex
blind-transcribe + the deterministic content_diff, with Claude the post-pass structural sign-off β a
figure has no "beat", so the bar is exact labels + clean layout, not narrative. Both obey the one rule:
The gate is the point: a beautiful panel/figure with a wrong number does not pass. Faithfulness is a
token-diff over reviewers who are never shown the expected values.
<a id="positioning"></a>
π§ Positioning β ARIS lineage; an audit layer, not a generation/orchestration claim
ARIS-Movie-Director is the multimodal vertical of the ARIS series: ARIS taught a research agent to work while you sleep, and its research-wiki + multi-agent-debate ideas are exactly what make a generated story auditable β the same loop (author a source of truth β let a model bake the look β ratify with a cross-model panel), now producing character-consistent visual stories instead of papers.
The framework knows nothing about any particular story β a project plugs in via examples/<name>/movie.project.json + a comic.json IR. The reference example builds a 19-scene / 24-frame pixel-art movie about an autonomous research run, and ships its real, inspectable generation trace as proof the multi-agent loop actually ran.
Related work β where we fit. The field already generates and orchestrates visual stories well, and we build on that, not against it: JoyAI-Echo (JD) is strong at long-form textβvideo with synced audio and memory-based character consistency; FireRed-OpenStoryline (Xiaohongshu) is a strong conversational video-editing agent β NL planning, tool orchestration, human-in-the-loop, reusable style skills; NEWTON shows planner-plus-verifier loops for physically-grounded video. ARIS-Movie-Director is complementary β it doesn't claim better generation or broader orchestration; it adds the audit layer around a generated visual story: blind cross-model reads β deterministic literal-diffs β bounded retry β an inspectable trace.
<a id="layout"></a>
π§© Layout
- packages/ β the framework runtime (core spiral, gates, conditioning, viewer)
- protocols/ β the cross-model review / governance contracts (framework-owned)
- schemas/ β versioned IR + wiki schemas (
comic.schema.json,node_schema.json,edge_schema.json) - cli/ β
validate_wiki.py(the stdlib release gate for a project's wiki) - docs/ β
comic-json.md(the authored-input spec),spiral-runtime.md(the live runtime doc),architecture.md(historical pre-rewire design),GENERATION_RETRO.md - examples/comic_m3_audit/ β the reference movie:
comic.jsonIR,gen/blueprint scripts,
panels/baked art,wiki/the 198-node generation trace (outputs/index.htmlβ the viewer β is
built on demand bybuild_comic.py, not shipped in the repo)
<a id="community"></a>
π¬ Community
New workflows, gates, and example projects welcome. ARIS-Movie-Director is part of the ARIS series β PRs that add an audited workflow, a gate with teeth, an example project, or a domain adaptation are welcome (start at CONTRIBUTING.md).
Join the WeChat group (shared with the ARIS main project) for discussion on Claude Code + AI-driven multimodal generation:
<a id="citation"></a>
π Citation
ARIS-Movie-Director is the multimodal vertical of the ARIS series. If you use it in your research, please cite the ARIS paper:
@article{yang2026aris,
title={ARIS: Autonomous Research via Adversarial Multi-Agent Collaboration},
author={Yang, Ruofeng and Li, Yongcan and Li, Shuai},
journal={arXiv preprint arXiv:2605.03042},
year={2026}
}
π License
MIT β see LICENSE.
The example artwork is AI-generated β this is a disclosure, not a second license; reuse should still follow your image-model provider's terms.
