CommunityImagegithub.com

FilmForge Painter

Writes every shot prompt from the shot list, character sheets, and the locked look so a painted film stays one picture.

What is FilmForge Painter?

Builds the image prompt for each shot of a painted AI film. It reads the shot list, the character sheets, and the style lock, and keeps costume, light, and rendering from drifting between frames.

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/gallowforge/filmforge/tree/HEAD/skills/forge-painter

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

What does FilmForge Painter do?

You turn the shot list into paintings that belong to one film. Every prompt is assembled from locked parts (the style lock, the ledger, the shot list), never improvised, so the same character is described with the same words in every shot. The lint proves it before money moves.

Paths: scripts/, templates/ and config/ below are folders inside this skill (the base directory shown when it loads), put there by ./install.sh. Working from a clone of the repository, they are tools/, templates/ and config/ at its root.

Inputs

shotlist.yaml (retimed), style-lock.yaml, continuity.yaml, the sheets and plates in art/sheets/.

Step 1. The ledger, shot by shot

For every shot, write its entry in continuity.yaml: which characters are in frame, which props (with their holders), which states (a wound, soot, a ribbon on the wrist). Props and states carry spans (from, until).

python3 scripts/ledger.py check continuity.yaml --shotlist shotlist.yaml

It fails on drift: a prop missing inside its span while its holder is in frame, a prop or state outside its span, an unknown id, a character list that disagrees with the shot list. Fix the ledger before writing a prompt.

Step 2. Write each prompt (prompts/<id>.md)

Follow the style lock's grammar, slot by slot (forge-style-lock, references/prompt-grammar.md):

  1. LOOK: the look for this shot (look: in the shot list, else the default), word for word.
  2. REFERENCES: one clause per attached asset, from style-lock.yaml references:, in the order you attach them; the relight clause.
  3. SHOT: the shot list's framing, camera height, lens feel, positions on thirds.
  4. SUBJECT AND SCALE: per character, handle + anchor + scale lock from the ledger; counts.
  5. MOMENT: the shot's beat as one instant.
  6. SETTING: place, weather, time of day, the background.
  7. LIGHT: direction, quality, temperature, and its source in the world.
  8. COLOUR: the scene's colour-script words.
  9. TEXT AREA, when the shot has text_area or narration over it.
  10. CONTINUITY: the ledger's props and states for this shot, word for word.
  11. LOCKS: every forbid clause covering this shot, word for word; shot-specific negations.
  12. AVOID: the tail, word for word.

The file format, exactly:

# s02: the last match

Model: gpt-image-2.5, high, 2K, 16:9. Attach: sheet_girl, sheet_moth.

```
<the prompt, slots 1 to 12 as paragraphs>
```

The first fenced block is the prompt; everything else is notes for people.

Step 3. Lint before spending

python3 scripts/ledger.py prompts continuity.yaml --prompts prompts --style style-lock.yaml --shotlist shotlist.yaml

It fails a prompt that does not open with the look, does not end with the avoid tail, misses a character's handle or scale lock, a prop or state anchor, a forbidden-colour clause, or contains a character's name. production.py spend refuses paint-stage spends while it fails. In the engine's example, the lint catches s03's missing scale lock; the painting made from that prompt drew the moth at a sixth of its size.

Step 4. Paint in batches of four

  • Order: sheets and proofs (style stage), then hero frames, then the rest scene by scene. Reuse shots and code shots cost nothing; paint them never.
  • Batch: four prompts, each with its references attached in the order its REFERENCES slot names them. Log the spend first: production.py spend 11.0 --item "s05-s08 batch 2".
  • Files: art/film/<id>_<slug>.png (s07a_child_reaches.png style: id first, then a slug). A repaint is <id>_<slug>_v2.png; a graded code fix is <id>_<slug>_g.png. The tools pick the newest version by name.
  • After each batch: forge-frame-qa reads every painting at full size before the next batch is painted. A fault found in batch one is fixed in the prompts of batch two before it repeats.

Step 5. Repaints

A repaint comes from forge-frame-qa with its cause and a corrected prompt. Put the corrected prompt in prompts/<id>.md, lint, log the spend, paint _v2, and send it back to QA. If the cause was in the ledger or the style lock (a lock missing for everyone), fix it there and re-lint every prompt.

Special cases

  • Picture-book pages: name the layout (spread 3:2, page 3:4, vignette 1:1 on a transparent background) and the text area in every prompt. All words are set in the book, never painted.
  • Video keyframes: paint the first frame (and the last when the move must end somewhere exact) through this same grammar; the motion prompt is a separate step, run only after the keyframe passes QA.
  • Key poses (poses: 2): one prompt per pose, identical except the MOMENT slot, so they snap cleanly.
  • Plates: empty locations, no characters, reused across shots; they carry the setting so prompts stay short.

Output

  • prompts/<id>.md for every painted shot, all passing the lint.
  • continuity.yaml with every shot's entry, passing ledger.py check.
  • art/film/ paintings, named by id, ready for QA.

Checklist before each batch

  • ledger.py check passes
  • ledger.py prompts passes for this batch
  • References attached in REFERENCES order; the right sheet versions
  • Spend logged; batch of four or fewer
  • The previous batch has its QA verdicts

Repair table

Lint or QA findingWhich slot to fix
does not open with the style lock1: paste the look, unedited
handle or scale lock missing4: paste from the ledger; add the ratio to something in frame
prop or state anchor missing10: paste from the ledger
forbidden-colour clause missing11: paste the rule's prompt
uses a name4 and anywhere else: replace with the handle
wrong size or wrong count in the painting4: scale lock and an exact count; then the sheet's scale bar
subject lit flat2: the relight clause; 7: a light with a source
text or letters painted9 and 12: the text area is for code; "text" in the avoid tail

References

  • references/batching.md: batch planning, naming, versions, and a worked batch from a real film

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

gallowforge/forge-director

FilmForge director: runs an AI film production end to end (story, style lock, score, paintings, frame QA, motion in code, sound, delivery, archive) through stage gates, so no credit is spent before its gate passes. Keeps the production state file (production.yaml) and the credit ledger, prices the plan against the credits, and always names the one next action. Use this skill whenever the user wants to make, plan, budget, continue or check on a short film, painted film, animated story, music...

gallowforge/forge-frame-qa

FilmForge frame QA: inspects every painting at full size against the character sheets and the continuity ledger, measures colour rules, palette and exposure with tools, scores it on a nine-criterion rubric and decides: accept, fix in code (naming the module and the exact parameters), or repaint (with the root cause and the full corrected prompt). Use this skill whenever paintings, stills, keyframes, character sheets or book pages come back from an image model, when the user asks whether...

gallowforge/forge-motion

FilmForge motion: plans each shot's life in code instead of credits (painted holds brought alive with drifting fog, ash, snow, rain, embers, glints, light sweeps, firelight flicker, heat shimmer, shake, lightning, glass cracks, transitions, golden threads, handwritten words and titles), maps every effect to the painted-film-pipeline renderer's exact parameters, applies frame-QA code fixes, exports the edit timeline and renders the preview; decides when paid video is worth its credits. Use...

gallowforge/forge-style-lock

FilmForge style lock: fixes one image model and setting, one look sentence (or two when the drawing itself carries the story), the palette and colour rules, the line, brush and lens language, the character-sheet specs with scale bars, and the prompt grammar every shot must follow, so every painting in a film or book matches. Use this skill whenever the user starts the visual side of a film, music video or picture book, wants consistent characters or one consistent look across many images,...

Related Skills