novel-art
Generates art bibles for AI short dramas: scenes + narrative props. Baked-in assumption: this is AI-generated, not live-action—no location scouting, set building, prop buying. Environments and props are assets that will be generated dozens of times and must look the same, so all deliverables revolve around consistency:
| Deliverable | What It Solves |
|---|---|
| Consistency anchors (3–5 per scene) | Viewers recognize the scene by these; QC uses them to check if generated shots have drifted |
| Lighting time-of-day variants | AI changing time of day means regenerating, not relighting—each state is a complete prompt |
| Empty-shot generation prompts | Environments and characters are two asset layers; mixing people into reference images ruins consistency entirely |
| Variant mechanism (variantOf) | Generating a new scene is cheap, but a variant reusing the parent scene's assets is more consistent |
| Prop state variants | A suitcase closed vs. open are two reference images—props have state arcs; scenes do not |
| Prop size reference | AI often draws handheld props the size of furniture; prompts must include size phrases |
| Prop white-background hand-free | Prop images must be cuttable for compositing into any shot; hands holding the prop are the most common contaminant |
{baseDir} = the directory containing this file. Script {baseDir}/scripts/novel-art.mjs, zero dependencies, runs directly with node.
Boundaries (what it does NOT do): No storyboarding, no script writing, no character work (that's novel-characters's job), no outline planning (that's novel-outline's job). Only narrative props (those that get close-ups, appear across episodes, carry story—typically 3–8 items) are collected—scene furnishings go into scene anchors; one-time hand props use shot-level prompts and are not separate assets.
Step 0 — Determine Input
Three input types, priority from high to low:
- outline.json (output of novel-outline)—optimal: scene list, episode appearances, payoff moments, reuse strategies are all prebuilt
- Original novel text—summarize scene list yourself (prioritize main stages; refer to novel-outline's main scene limit approach: don't overdo it)
- User-written scene list
If a cast.json (output of novel-characters) is available, include it—needed to verify that prompts contain no character names.
Step 1 — Seed Skeleton (only if outline.json exists)
node {baseDir}/scripts/novel-art.mjs seed <outline.json> > <workdir>/art.json
Deterministic transfer: scene id/name/main scene flag/episode appearances/payoff moments; scenes with reuse strategies get a seedNote suggesting they be made as variants. Don't let the model regenerate these facts.
Without outline.json, build the list yourself using references/schema.md.
Step 2 — Fill Settings Per Scene + Extract Narrative Props
One task per scene, enable concurrency if possible. Each task receives:
{baseDir}/references/scene-pass.mdand{baseDir}/references/schema.md(read them, follow them)- The skeleton for that scene + all information from the novel/outline about that space
- Names of other scenes in the same batch (spatial atmosphere must be differentiated; don't make everything the same "shabby")
Core requirements are in scene-pass.md; the three heaviest: anchors must be paintable, verifiable, and checkable ("patched boat canopy" is an anchor; "dilapidated atmosphere" is an adjective); lighting states are derived from episodes, don't write a full set that won't be used; always use variants instead of creating new scenes.
Narrative props should preferentially consume from the outline: as of version 1.1.0, outline.json includes props; seed transfers the prop table along with "what it carries," "which payoff moments it supports," and "which episodes it appears in"—this step only fills design fields (size, anchors, state variants, white-background prompts). If the outline has no props, extract from the novel text—then this step is the model's job: collect only props that have close-ups, appear across episodes, and carry story; typically 3–8, on the same order as the number of main characters. Fill each according to references/prop-pass.md: dramatic function, anchors, state variants, size, white-background hand-free prompt. A suitcase that "follows a character" belongs here—don't stuff it into scene anchors or character profiles.
Step 3 — Validation ⛔ Cannot Skip
node {baseDir}/scripts/novel-art.mjs validate <art.json> --cast <cast.json>
All 10 quality gates are code. Scenes share 6 gates: anchors 3–5, lighting states ≥1, no people, prompts entirely in English, no character names (only checked if --cast is given), variant references complete. Props have 4 dedicated gates: states ≥1, size phrase included in prompt, negative prompt bans hands, design image pure white background.
Fix any violations one by one, re-run until passing.
Step 4 — Output & Report
cd <output directory>
node {baseDir}/scripts/novel-art.mjs render <drama-name>-art.json --md > <drama-name>-art.md
node {baseDir}/scripts/novel-art.mjs render <drama-name>-art.json --html > art-report.html
Report interface defaults to Chinese; for English use --lang en (or set "lang": "en" at the top level of art.json; --lang has priority). render by default looks for images in images/<slug>-sheet.png alongside art.json (for both scenes and props); if images are elsewhere, use --images <directory> to point there—this skill does not generate these files; after downstream image generation, re-run render to embed them. Report includes: KPIs, scene list, scene detail cards, prop list, prop detail cards (with anchor checklists / state variants / prompt packages all with copy buttons), quality gate panel, JSON export (downloads art.json as-is).
One-line summary: how many scenes (main scenes / variants each), how many props, total anchors, report path; mention any failed gates explicitly.
Do not say "images generated"—that step no longer exists; the deliverable is prompts.
Final layout:
<output directory>/
├── <drama-name>-art.json
├── <drama-name>-art.md
├── art-report.html ← double-click to open
└── images/ ← this skill does not write this directory
└── <slug>-sheet.png ← downstream puts generated images here; render will pick them up
The Three Skill Relay
novel-outline → outline.json (What: structure & episodes)
novel-characters → cast.json (Who: character assets)
novel-art → art.json (Where + what's in hand: art assets)
seed consumes the scenes and props sections of outline.json (if outline has no props, props are left blank and the model extracts from the original text); --cast consumes cast.json. Each of the three JSON files has a report with export buttons; after modifications, they can be fed back to their respective render/validate commands.
Boundaries
- Report interface supports Chinese and English (
--lang; defaults to Chinese, or follows thelangfield in art.json); generation prompts are always in English - This skill does not generate images.
image.sheetis a layout instruction for downstream; sheet specs are inreferences/sheet.md - Scene count has no hard limit—the limit is enforced by novel-outline's main scene gate; here, each asset's quality is managed
- Only narrative props are collected, 3–8 items recommended—each additional item requires more cross-episode consistency maintenance
Self-Test
node {baseDir}/scripts/selftest.mjs
151 assertions; no model calls, no quota spent. Each of the 10 quality gates has its own breaking test case. Run this after modifying scripts.
Built-in Example
{baseDir}/examples/Ferry-art.json: Complete settings for three scenes + two narrative props (old suitcase, old county office inkstone) from "Ferry"; all quality gates pass (including character name checks against the novel-characters example cast). Serves as a quality baseline and a test fixture.