$npx -y skills add wanshuiyin/ARIS-Movie-Director --skill comic-continuity-auditThe authoring-side DIEGETIC continuity AUDIT — it produces the world-state evidence that comic-cross-layer-gate --gate continuity adjudicates against the storyboard's MOTIF STATE TABLE (motif_ledger). It checks each baked panel STRICTLY against the pre-committed table row, then
| 1 | # comic-continuity-audit — the Motif-State-Table Audit (Phase 1, step S11) |
| 2 | |
| 3 | The **diegetic-continuity AUDIT step of the [`comic-author`](../comic-author/SKILL.md) suite**: verify that a |
| 4 | baked panel obeys the **WORLD-LOGIC** the comic committed to — time / prop-state / motif-arc / metric-value / |
| 5 | causality across cuts — *distinct from* identity/style (`comic-director`'s `panel_gate` already covers "does |
| 6 | the character LOOK the same"; this covers "does the WORLD stay consistent"). The audit is **not vibes**: it |
| 7 | reads the pre-committed **MOTIF STATE TABLE** authored by [`comic-storyboard-creator`](../comic-storyboard-creator/SKILL.md) |
| 8 | (the `motif_ledger` node) and checks each baked panel STRICTLY against its own row + the film's global |
| 9 | invariants. **This skill is the AUDIT producer, not the gate**: it emits a continuity `review` node (world-state |
| 10 | evidence) that [`comic-cross-layer-gate`](../comic-cross-layer-gate/SKILL.md) `--gate continuity` collects and |
| 11 | adjudicates — *the loop can DRIVE but it cannot ACQUIT* ([`acceptance-gate`](../../protocols/acceptance-gate.md)). |
| 12 | On a same-panel miss it requests a `retry_panel`; a cross-frame motif break is handed to the page |
| 13 | **assembly_gate's drift set** (seed-anchored comic panels are independent — there is **no cross-panel |
| 14 | rollback** in this image pipeline, [`spiral_engine.js:54`](../../packages/core/spiral_engine.js)). It ports the |
| 15 | real procedure of aris_movie's `continuity-audit` (Gemini-as-fact-extractor → Claude-as-deterministic-judge → |
| 16 | violations → routed repair) onto stills, but anchors it to our **pre-committed per-dimension-per-panel ledger** |
| 17 | instead of asking a holistic judge to infer intent. |
| 18 | |
| 19 | > **Cardinal lesson baked in as a predicate, not prose:** *the audit IS the table.* The audit never invents a |
| 20 | > rule — it reads the `motif_ledger` and flags any panel whose observed value contradicts that panel's row. And it is |
| 21 | > **cast-aware**: a panel that simply does not contain a character (the duo are absent in S01/S03/S06/S18/S20/S22 |
| 22 | > by design) is **design, NEVER a drift penalty (absence≠drift).** This is the concrete fix for the B03 |
| 23 | > cross-frame **FALSE-drift**: *IDENTICAL `min=0` scores across re-bakes were the fingerprint of a broken, |
| 24 | > cast-blind RUBRIC — not a broken artifact.* When scores don't move across repairs, audit the JUDGE (is it |
| 25 | > reading the table? is it penalizing intended absence?), do not keep regenerating the panel. |
| 26 | |
| 27 | ```text |
| 28 | motif_ledger (the TABLE) ─▶ ① LOAD attempt + prior-accepted + this panel's table row + active continuity_constraints |
| 29 | ▼ |
| 30 | ② EXTRACT Gemini auto-gemini-3, ONE analyzeFile per panel image, FACT-ONLY (no scoring, no comparison) |
| 31 | ▼ |
| 32 | ③ JUDGE Claude deterministic: observed ⊖ table-row AND global invariants |
| 33 | │ (DDL monotonic · bounce S02=ONLY MAX · metric columns never co-mingle · MIRROR LOCKS) |
| 34 | ▼ |
| 35 | ④ CAST-AWARE FILTER intended-absence ≠ drift; design variation ≠ drift (read the row's design intent) |
| 36 | ▼ |
| 37 | ⑤ EMIT one continuity review node (always) + 0-N continuity_constraint candidates + observed_state patch |
| 38 | ▼ |
| 39 | contradiction? ─ yes ─▶ same-panel miss: request retry_panel (failure_mode.repair_pattern = positive invariant) |
| 40 | │ cross-frame break: add panel id to the page assembly_gate drift set (NO cross-panel rollback) |
| 41 | │ no |
| 42 | ▼ |
| 43 | ⑥ the continuity review node |