← Files PicsartARCHIVED FILE
skills/film-finishing/SKILL.md
11.8 KB · Oct 10, 2026 · 18:02 UTC
---
name: film-finishing
description: "Finish the film — colour unification and grade, the soundtrack decision (keep generation audio, add a music bed, or hand off to a sound team), the final-resolution pass, masters, and the project archive. Use for stages 9–11 of the film pipeline, after picture lock and cleanup. Routed from the film skill."
---
# ChatGPT and Codex integration
Apply these host conventions throughout this skill and its references.
- Discover the connected Picsart tools and use their actual names and schemas.
The `picsart_*` names in the workflow identify tools, not a fixed host namespace.
If the connection is missing, explain that Picsart must be connected; continue
script and shot planning when possible. Never invent tool results or renders.
- Read board decisions from the current user message and attached widget context.
Use `read_widget_context` only if the host actually exposes that tool. Do not
assume ChatGPT has Claude's context reader. Treat a board's initial tool result
and unsent widget state as previews, never as user approval. If a submitted
decision has no accessible payload, explain briefly and use the text fallback
to collect the missing decision; do not guess or repeat charged operations.
- Use the host's available question interface or one concise conversational
question for preset choices.
- UI rendering and delivery of feedback are the remote MCP server's responsibility.
If a board is unavailable, present its relevant options in text and record the
user's selection using the same documented feedback fields. Do not claim that
a plugin manifest makes Claude-specific widgets compatible with ChatGPT.
- Save `film.json` and artifacts in the user's writable project workspace, not
the installed plugin directory. If persistent file tools are unavailable,
keep a structured project checkpoint in the conversation and provide it for
download when the host supports files. Never claim a file was saved without
confirmation from a file tool.
- Honor the user's current instructions and already authorized scope. Preserve
quoted spend limits and production locks; do not infer authorization from a
preview, a timeout, or a connection being installed. A timed-out charged call
needs a status check before considering a retry.
- This package holds six film skills (`film`, `film-development`, `film-assets`, `film-scenes`, `film-edit`, `film-finishing`) and three motion skills (`motion`, `motion-import`, `motion-design`). Route between them directly.
- `motion-import` reads a design's layers through the Figma app's tools. If Figma is not connected in this host, use its flat-frame fallback and say so once.
# Finishing — grade, sound, master, archive
Picture lock is behind you; nothing here changes the cut. The order inside this
skill is fixed and worth saying out loud to the user: **final-res re-roll →
re-assemble → grade → export once → masters → archive.** Grading the 480p draft
wastes the grade; exporting before the grade wastes an export.
For the paid final pass, follow `../film-scenes/SKILL.md`, **Native draft to
final**: use `fromDraft` only when this connection's live schema and preflight
accept it. Otherwise explicitly quote a regular final rerender and review the
changed picture before grading. Keep this plugin's existing export and delivery
flow; a draft is not a final-resolution deliverable.
## The final-resolution pass — pay once
The final quality comes from
**re-generating every approved shot at the final resolution with its saved final
prompt, verbatim** — same blocks, same references, higher `resolution`. Preflight
the whole batch, quote the total, and dispatch only on the user's yes; this is
the film's biggest single spend and the one that must never arrive as a
surprise (2026-09-07). Video upscaling exists on this surface; pick the upscaler
from the live catalog at the time of the pass (`picsart_model_catalog`,
`purpose: "utility"`) — none is named here, because the tools change. **The
practitioner post order is: upscale FIRST, then texture, then grade** — every
downstream correction should touch the highest-resolution pixels. Then
re-assemble the locked cut at the final canvas (≤1920×1920 —
multi-shot output cannot exceed it, whatever a single model renders).
Say the quiet part: this pass follows the approved prompts but is a **fresh
roll**. Small differences from the draft are expected and are not a bug. Where a
re-roll visibly breaks something the draft had (a face, a join), that is a Stage 8
regeneration on the final-res take — log it, fix it, move on.
## Stage 9 — colour: unify, then grade
Every generation arrives with its own baked-in grade, so the first job is
**unification** — bring neighbouring shots of each scene to one look — and only
then the creative grade. The creative tone already exists: it was baked into the
location assets in Stage 4, so the grade refines, never invents.
**There is no grade console.** It was retired on 2026-08-21 while the earlier
stages are being made right, and no grading panel exists yet. Until one does: resolve the real looks yourself with
`picsart_media_resolve_looks` (never a remembered look name), offer three or four
against the bible's palette line (or the locations' own colours with scheme
Auto) via the host's question interface, then apply. The mechanics
are unchanged — `picsart_media_apply_look` / adjust patches on the assembled
scene, free to set, charged only when a preview
(`picsart_media_contact_sheet`, per frame) or the export renders. Preview the
grade on a handful of frames from two or three scenes before approving it for the
film.
Scope order: per-scene unification first (`scope: "sc01"`), then the film-wide
look. **The anti-AI-look recipe** — the documented practitioner finish for
generated footage — layers in this order: upscale (above) → a film-grain /
fine-texture pass → the grade "until it reads closer to live action". Footage-
level grain at finishing is distinct from the style prefix's in-generation
grain: the prefix shapes what the model renders; this pass unifies what the
renders became. If the user has a real colorist instead, export ungraded and
hand off — see the package below.
## Stage 10 — sound: clean, bed, or hand off
What generation gave you: lip-synced dialogue in the shot, in-frame action noise,
some ambience. What it cannot give: consistent voice timbre between clips,
licensed music, a mix. The in-chat path:
- **Dialogue follows the film's voice policy** (`film.json.voicePolicy`, always
`native` — there is nothing to decide, `film-development`). `native`: the generated voice is the performance — never
re-recorded; between-clip timbre drift is a fact, and where it distracts,
prefer a retake of the worse clip (Stage 8 path) over pretending a mix exists
here.
**The voice pass is parked (2026-08-27), and Stage 10 works with what the
takes gave it.** The swap that keeps lip-sync needs a library `voiceId` and a
designed voice cannot become one on this platform — the request is in
`../../docs/ASK-VOICE-ID.md`; when it lands, the pass is: read the take against
the script line, extract its audio, isolate it if there is room tone, convert
it into the character's recorded voice, mux it back — same length out as in (±3ms
measured), so nothing needs re-timing.
Until then, sound at Stage 10 means the two things that ARE available: a
continuous bed under each scene to hide the level and tone steps at every join,
and honest level matching shot to shot. Do not offer a voice fix; say what the
film has.
Where a mouth is on screen for a whole line and even that is not tight enough,
the shot can instead be generated audio-driven from the start
(`ltx-2.3-a2v` — an audio track plus an optional first frame), so the lips
follow our voice from the outset. Check the
catalog for what is current rather than remembering a model id. Changing
policy mid-film re-opens every dialogue shot; that is why it is decided at
the lock.
- **Ambience is the glue**: when shots of a scene differ slightly in picture, a
continuous bed stitches them into one space. Generation audio is per-clip, so
seams are audible; note where, and lean on the music bed to carry across them.
- **Music bed — offered ONCE, only after the cut is picked.** Scoring a cut
that is about to change wastes the track, and a declined offer is settled for
the session. Don't interrogate ("do you want music?") — draft the brief from
what the film already knows (register from the bible, tempo from the cut) and
offer three exits: generate it, tweak the vibe, or skip.
`picsart_generate` with a music model from the live catalog
(`picsart_model_catalog`, `mode: "audio"`, `inputType: "music"`), and
**instrumental always under speech** — vocals fight the dialogue for the same
perceptual channel and both lose. Mix as a separate compositor audio track,
dialogue dominant (duck the bed under lines; at full level only when the film
has no speech). Flag plainly that generated music's licensing is the user's
to verify for festivals/commercial use.
- **Sound post is a team's job**: a film going to festivals or dubbing needs a
sound post team; offer the handoff package instead of imitating one.
**Handoff package** (either stage, when a human colorist/sound team exists): the
clean cut + per-shot source URLs from selects at max quality, the shot order and
trims from `docs/`, the bible (tone, colour scheme and palette line), the sound references gathered
with the film's references, and the generation audio as-is. Everything already durable on Drive —
that is the handoff.
## Stage 11 — master, QC, archive
QC on the full final export, ideally by fresh eyes, per the checklist in
`references/DELIVERY.md` (artifacts, joins, digital errors, titles — titles are
made in an editor or as overlay tracks, never generated; models cannot hold clean
typographic text). Then the deliverables and the archive — the full table and
list live in `DELIVERY.md`. The archive is not sentimental: prompts + registry +
log are **the means of production**; a sequel or a re-cut regenerates from them.
**The disclosure pack is a deliverable, not a note.** 2026 festivals (SXSW,
Tribeca, the AI-specific festivals) require disclosure of the AI tools and
models used — incomplete disclosure disqualifies at some. Write
`docs/DISCLOSURE.md` mechanically from the generation log: every model used,
per stage (images, video, voices, music), plus the human-contribution
statement and an AI-credits block for the titles. It costs nothing and the
film cannot be submitted without it.
Gate out (the film is done): QC notes closed · masters exported and checked by
playback · archive on Drive, complete · `DISCLOSURE.md` written · rights notes
(voices, music, AI-use disclosures where a platform requires them) gathered in
one place.
## Costs
| Free | Charged |
|---|---|
| look resolution, grade setting, scene re-bootstrap, planning, handoff assembly, every `picsart_media_export` (final and each master variant — render time and a file, **not credits**, 2026-09-07) | the final-res re-roll (every shot, video rates), grade previews (`picsart_media_contact_sheet`, per frame), music generation |
## Traps
- Grading before the final-res re-roll — grade the final pixels, not the draft's.
- Calling the final pass an upscale. It is a fresh roll; say so before it runs.
- Re-rolling the film at final resolution on the strength of the original
forecast. Quote this batch, then wait — it is the biggest single number in
the project.
- "One more export" per master variant nobody asked for. Exports cost no
credits, but each is a real render and another file in the user's Drive —
confirm the deliverable list first.
- Shipping generated music to a festival without the licensing caveat in writing.
- Archiving the film but not the prompts and registry — the film without its
means of production cannot be revised or continued.
SHA-256: d9056804d215578ec483be7741a740f79347e16d1a19625e151b37563b011aa8