$npx -y skills add wanshuiyin/ARIS-Movie-Director --skill comic-asset-review-loopPhase-1 (S5) UPSTREAM ref-asset gate — the bounded cross-model adversarial loop that LOCKS one reusable identity-locked asset (character sheet / location plate / prop cutout / text-panel / logo-free symbol) BEFORE it can be composited into any panel. This is NOT the panel_gate (c
| 1 | # comic-asset-review-loop — the UPSTREAM ref gate (Phase 1 · S5) |
| 2 | |
| 3 | The **ref gate the comic side was missing.** `comic-director`'s `panel_gate` reviews *composed output*; the |
| 4 | `assembly_gate` reviews *cross-panel consistency*. Neither gates the **identity refs that feed both** — so |
| 5 | without this skill, identity drift is only caught *downstream*, after credits are spent on a panel bake. This |
| 6 | skill is the **Layer-2 gate on a SINGLE reusable reference asset** (the character sheets / location plates / |
| 7 | prop cutouts the `ART_BIBLE.md` points every bake at), run **before** any panel composition. |
| 8 | |
| 9 | A reusable asset is a one-way door: once a hundred panels condition on `duo_canonical_ref_v001.png`, you cannot |
| 10 | quietly swap it. So the lock must be **earned cross-model**, never self-certified by the generator. This skill |
| 11 | locks an asset **only at 准×3** — Claude *and* Gemini *and* Codex each independently pass the **same** review |
| 12 | round — or it sends the asset back to be regenerated, or (at the round ceiling) escalates the asset |
| 13 | *requirement* itself back to the outline/storyboard layer. The executor (and the generation model family) |
| 14 | **never** acquit their own ref. |
| 15 | |
| 16 | **Pipeline position (the Phase-1 asset DAG — the documented contract):** this lock runs AFTER the |
| 17 | human-approved outline (OUTLINE_DRAFT_VALID only requires every referenced asset to be DECLARED with a |
| 18 | complete, generatable request — never pre-locked assets) and the **provisional** storyboard's |
| 19 | `consolidated_asset_requests`, and BEFORE OUTLINE_FINAL_LOCK (cheap re-check that the locked assets still |
| 20 | match the approved outline) → storyboard FINAL asset-resolution validation → blueprint authoring, where the |
| 21 | hard locked-asset barrier sits. (The old single-stage contract — outline gate demanding locked assets — |
| 22 | deadlocked and is retired.) |
| 23 | |
| 24 | ```text |
| 25 | asset (review_status:"pending") ◀── comic-asset-ref-generator (S4: generates, NEVER self-locks) |
| 26 | │ |
| 27 | ▼ |
| 28 | LAYER 1 — STATIC CI GATE (deterministic, zero credits) |
| 29 | check_asset_collisions.py (one canonical owner per filename — "one visual dialect, never two") |
| 30 | + build asserts: zero-text contract · literal contract · raster-ref 6-field completeness |
| 31 | │ pass |
| 32 | ▼ |
| 33 | LAYER 2 — VISUAL LOOP (round R = 1 … MAX_REVIEW_ROUNDS=3) |
| 34 | ① Claude narrative ‖ ② Gemini visual (primary: identity/iso) ‖ ③ Codex synth (policy/semantic) |
| 35 | each reads the REAL asset file · scores 5 dims (0–5 ints) · flags failure_modes from the fixed vocab |
| 36 | │ |
| 37 | ▼ Codex synthesises: MIN-fuse per dim (max for inverted) · threshold · per-reviewer unanimity |
| 38 | 准×3 ? ── no, a family HARD-FAILS a floor ─▶ comic-asset-ref-generator --regenerate (bump version) ─▶ ① R+1 |
| 39 | │ no, third family just ABSENT (e.g. Gemini down) ─▶ re-VOTE (re-collect the missing reviewer; NO re-bake) |
| 40 | │ no (safety_ip<3) ─▶ HARD abandon_shot (IP veto, no retries) |
| 41 | │ no (R == MAX_REVIEW_ROUNDS) ─▶ ESCALATE the asset REQUIREMENT to outline/storyboard (abandon_shot) |
| 42 | │ yes |
| 43 | ▼ |
| 44 | LOCK — asset.status=locked + payload.review_status=locked (ONE-WAY DOOR, immutable for the rest of Phase 1) |
| 45 | + score_progression audit table (ASSET_REVIEW.md) + decision/review/failure_mode wiki nodes + edges |
| 46 | ``` |
| 47 | |
| 48 | ## Constants |
| 49 | - **REVIEWERS** = Claude (this agent, narrative) ‖ `mcp__gemini__analyzeFile` (`model: "auto-gemini-3"`, NEVER |
| 50 | raw `gemini-3.1-pro` — 429 silent-downgrade to 2.5) ‖ `mcp__codex__codex` r1 / `mcp__codex__codex-reply` r2+ |
| 51 | (`model_reasoning_effort: "xhigh"`, save the `threadId`; pin **no** model — Codex reviewer calls follow the |
| 52 | local codex |