$npx -y skills add wanshuiyin/ARIS-Movie-Director --skill comic-blueprint-authorPhase-1 (S7 of the comic-author suite) — turn ONE locked panel_spec into a deterministic content-SVG blueprint that becomes the bake condition (reference #1 of the agent mcp__codex__codex sidecar bake), by WRITING A PYTHON GENERATOR (never raw SVG in chat — LLMs botch coordinates
| 1 | # comic-blueprint-author — one panel_spec → a deterministic content-SVG blueprint (S7) |
| 2 | |
| 3 | The **per-panel condition author** of the [`comic-author`](../comic-author/SKILL.md) Phase-1 suite. It sits |
| 4 | between the storyboard ([`comic-storyboard-creator`](../comic-storyboard-creator/SKILL.md)) and the bake |
| 5 | ([`comic-director`](../comic-director/SKILL.md)): for ONE locked `panel_spec` it produces ONE deterministic |
| 6 | `content_svg` — the answer-key composition image the bake conditions on. Concretely (the live seam, |
| 7 | `run_comic.py` + `pickup_image.build_bake_prompt`): the engine renders the SVG to a PNG via headless Chrome, |
| 8 | and the agent-side **`mcp__codex__codex` sidecar bake** embeds that render as the **FIRST of exactly two |
| 9 | absolute-path reference images written literally into the bake prompt** (ref #1 = the blueprint render, |
| 10 | ref #2 = the canonical identity sheet — the mcp schema has NO `-i` image param, so paths ride in the text), |
| 11 | `sandbox: workspace-write`, and the returned PNG is verified by `pickup_image.py --out-existing`. |
| 12 | Unlike video, **the panel IS the deliverable** — there is no i2v start-frame residue, no motion, no temporal |
| 13 | chaining. The whole job is to LOCK what the panel must contain (numbers, layout, where the empty bubble |
| 14 | real-estate lives) so the image model has a precise composition to finalize and the `blueprint` gate has a |
| 15 | ground truth to diff against. You author this **by writing a Python generator script** — mirroring |
| 16 | [`examples/comic_m3_audit/gen/asset_lib.py`](../../examples/comic_m3_audit/gen/asset_lib.py) + |
| 17 | `gen_*_blueprints.py` — because hand-writing raw SVG coordinates in chat is exactly how LLMs botch a figure |
| 18 | (misplaced rects, off-canvas text, collisions). The script is the artifact; the SVG is its deterministic, |
| 19 | re-runnable output. |
| 20 | |
| 21 | ```text |
| 22 | locked panel_spec ─▶ ⓪ PREFLIGHT (assert refs status=locked + output_ref present; build input_refs; non-empty) |
| 23 | ▼ |
| 24 | ① TEXT-MODE BIFURCATION (baked → expected_literals verbatim · scene/no-numbers → html) |
| 25 | ▼ |
| 26 | ② WRITE A PYTHON GENERATOR (import only from asset_lib · palette pinned to ui_tokens) |
| 27 | │ draws characters+scene+figures · leaves negative-space SAFE ZONES · NO bubbles |
| 28 | ▼ |
| 29 | ③ EMIT content_svg + run check_asset_collisions.py (single-source, mandatory) |
| 30 | │ + zero-text assert for no-text panels (constellation etc.) |
| 31 | ▼ |
| 32 | ④ WRITE the blueprint node (content_svg, expected_literals, safe_zones, html_bubbles, |
| 33 | │ crop, negative_space_policy, generator_script, file_sha256) |
| 34 | ▼ |
| 35 | ⑤a PRE-GATE FAN-OUT (raster→PNG · CC render/lint ‖ Codex xhigh ‖ Gemini → write |
| 36 | │ review:* nodes + `reviews` edges → blueprint ·never call the gate cold·) |
| 37 | ▼ |
| 38 | ⑤b comic-cross-layer-gate <blueprint_id> --gate blueprint (FUSES the reviews) |
| 39 | │ refs_present≥4 ∧ spatial_correctness≥4 ∧ blueprint_renders≥4 (+ text_preservation |
| 40 | │ if baked) → approve · safezone_quality<3 → fallback(→HTML) · MAX_REGEN=3 |
| 41 | │ hard veto: image-bubble text · content_svg:null |
| 42 | verdict? ─ revise ─▶ ② (fix the generator, re-emit) ─ fallback ─▶ route text→HTML, re-emit |
| 43 | │ approve ─▶ gate flips status=locked |
| 44 | ``` |
| 45 | |
| 46 | ## Constants |
| 47 | - **AUTHORING MEDIUM = a Python generator script**, not raw SVG. One `gen_<panel>_blueprints.py` per panel (or |
| 48 | per beat-group), importing the single-source builders from |
| 49 | [`asset_lib.py`](../../examples/comic_m3_audit/gen/asset_lib.py). **Never** paste SVG coordinates into chat |
| 50 | and never hand-edit the emitted `.svg` — re-run the script. |
| 51 | - **PALETTE PINNED** to `comic.json` `ui_tokens` (and the per-character hexes in |