{"id":30712,"plugin_id":"plugin_asdk_app_6a18d4c190a0819186e6b129a09e931e","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-09T18:02:36.587Z","digest":"c30187b960c576f0f47ea05067210b7f98daae881b5235a2d306caf39181b5f3","against":null,"payload":{"description":"Edit the film from selected takes to the cut the user calls final — scene assembly, evidence-based join repair, reshoot orders, review and the user's own final cut. Use for stages 7–8 once scenes have selects, or when the user wants a better join between existing clips. Routed from the film skill; a one-off montage uses the same compositor without the pipeline around it.","included_files":[{"relative_path":"references/ASSEMBLY.md","size_in_bytes":11157},{"relative_path":"references/JOIN-REPAIR.md","size_in_bytes":5899}],"name":"film-edit","skill_md_contents":"---\nname: film-edit\ndescription: \"Edit the film from selected takes to the cut the user calls final — scene assembly, evidence-based join repair, reshoot orders, review and the user's own final cut. Use for stages 7–8 once scenes have selects, or when the user wants a better join between existing clips. Routed from the film skill; a one-off montage uses the same compositor without the pipeline around it.\"\n---\n\n# ChatGPT and Codex integration\n\nApply these host conventions throughout this skill and its references.\n\n- Discover the connected Picsart tools and use their actual names and schemas.\n  The `picsart_*` names in the workflow identify tools, not a fixed host namespace.\n  If the connection is missing, explain that Picsart must be connected; continue\n  script and shot planning when possible. Never invent tool results or renders.\n- Read board decisions from the current user message and attached widget context.\n  Use `read_widget_context` only if the host actually exposes that tool. Do not\n  assume ChatGPT has Claude's context reader. Treat a board's initial tool result\n  and unsent widget state as previews, never as user approval. If a submitted\n  decision has no accessible payload, explain briefly and use the text fallback\n  to collect the missing decision; do not guess or repeat charged operations.\n- Use the host's available question interface or one concise conversational\n  question for preset choices.\n- UI rendering and delivery of feedback are the remote MCP server's responsibility.\n  If a board is unavailable, present its relevant options in text and record the\n  user's selection using the same documented feedback fields. Do not claim that\n  a plugin manifest makes Claude-specific widgets compatible with ChatGPT.\n- Save `film.json` and artifacts in the user's writable project workspace, not\n  the installed plugin directory. If persistent file tools are unavailable,\n  keep a structured project checkpoint in the conversation and provide it for\n  download when the host supports files. Never claim a file was saved without\n  confirmation from a file tool.\n- Honor the user's current instructions and already authorized scope. Preserve\n  quoted spend limits and production locks; do not infer authorization from a\n  preview, a timeout, or a connection being installed. A timed-out charged call\n  needs a status check before considering a retry.\n- 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.\n- `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.\n\n\n# Edit — takes → one review → the final cut\n\nThe editor's material is **selects only** — never the raw generation pile. And AI\nediting has one structural difference from set footage: a reshoot costs minutes,\nso **the edit runs in parallel with generation and actively orders shots**: \"need\na cutaway to the hands\", \"need a wider size between 12B and 12C\". Route those\norders back to `film-scenes` as new shot cards after checking the existing\ncoverage. For a bad join, first read **Join repair** below: a repair is not\nautomatically a model call. A new connecting insert can preserve both accepted\nclips; it does not require re-rolling their run. Say what will change, what stays\nuntouched and the cost before any charged order (`film-scenes` step 5).\n\n## Join repair — diagnose the pair before choosing the operation\n\nWhen the user wants two existing clips to connect better, read\n[JOIN-REPAIR.md](references/JOIN-REPAIR.md). Inspect both sides with sound and\nactual boundary frames, explain the observed failure, and recommend the smallest\nrepair that addresses it. Missing story information needs a motivated beat, not\na cosmetic transition. Keep the accepted cut unchanged while comparing candidates.\n\n## The automatic rough cut is off (2026-09-04)\n\n**A run arrives already cut.** The model made every internal cut, and a video edge\nis joined by the handbook's angle change (`film-scenes/references/SEAMS.md`), so the pass this\nskill used to run before anyone watched — a trim per shot derived from the\nline's word timings or the beat clock, then a seam pass moving the points at\nevery boundary — has nothing left to derive. It is switched off. What happens\ninstead when a run lands (`film-scenes` step 6): the take is split at its\ndelivered cuts (`cutTimesActual`, compositor bookkeeping), and the scene editor\nopens on the run **as delivered** — every shot a clip with the model's cut as its\nbounds, no trims applied, nothing shaved. The user trims where they want to, and\nonly then does a shot get a `trim`, always with `trimSource: \"user\"`.\n\nThree things this changes, said once:\n\n- **No \"I made a first rough cut\" line, no alignment wait.** The board opens the\n  moment the split is written. There is no automatic window to explain or to\n  reverse.\n- **The run's end handles play until the user trims them.** With `handles` on,\n  the run's two ends carry unscreened seconds by design; nothing trims them now,\n  so they are visible on the board and a drag away from gone. `film-scenes`\n  keeps the per-film switch; this is the consequence to know when setting it.\n- **`trimSource` has one live value, `user`.** `aligned` and `planned` are parked\n  with the pass that produced them; read one on an old `film.json` as \"an\n  automatic window from before 2026-09-04\" and leave it alone like a `user` one.\n\n**Transcription still earns its keep — for \"the line reads\", not for trims.**\n`video-transcribe-audio` (classic Picsart API plugin, when installed) is diffed\nagainst the scripted line to catch lip-sync saying the wrong words and to verify\nthe one-second silence tail; without the plugin, judge by ear and say so. It no\nlonger places an in-point.\n\n**User trims stay reversible, and that is a constraint on how the editor is\nopened.** Author each shot as a track clip on the run's url with\n`content.trim` in run-file seconds bounded by the `cutTimesActual` either\nside of it — never a trimmed export — and open the editor on that scene. The\neditor trims windows over the source, so widening a trim back is one handle\ndrag: free, instant, no round trip. Export a\ntrimmed clip and show that instead, and the trimmed second stops existing. Past\na delivered cut is the next shot's picture, not trim room; past `genSec` there\nis nothing, and that is a retake, not a trim.\n\nTheir edits come back as `scene_editor_feedback.document` — the scene as they\nleft it, each piece a clip with its `content.trim` over its source, in play\norder — and land straight on each shot's `trim` with `trimSource: \"user\"`. A `user` trim is never touched by anything automatic; a\nre-rolled run re-opens untrimmed, because its cuts are new.\n\n*Parked, for when it returns:* the derivation order was speech alignment (first\nword − 0.2–0.4s breath, last word + `tailHold`, clamped before invented sound)\n→ the plan (the first beat in motion, last beat + `tailHold`) → a seam\npass per cut rule. It was designed for takes born in separate generations;\na run makes it redundant, not wrong.\n\n## What generated footage cuts like\n\n- **It runs draggy.** Entries into action are slow. Cut more aggressively than\n  feels necessary.\n- **Held AI motion reads uncanny.** Viewers notice something is synthetic when\n  a generated shot is HELD: dramatic beats sustain 4–7s at most, action cuts\n  live at 1–2s, and mathematically even cut lengths read as machine editing —\n  vary them on the emotional beat. A solo take was generated long (10–15s) as\n  coverage and **the cut uses 3–8 seconds of it**; a shot inside a run was\n  generated at its `sec`, so the 3–8 seconds were authored and the cut uses\n  roughly all of it. On a solo take, trim into it: the best in-point is rarely\n  the first stable frame.\n- **The edges drift.** The first and last half-second of a *generation* are the\n  least stable. Plan to trim both; that is what the shot's `trim` field is for.\n  Inside a run the edges are the run's, not each shot's — the model's own cuts\n  are clean and are not shaved.\n- **Cut on motion, match motion.** Prefer cutting while something moves, and\n  match motion direction across the seam — two static compositions butted\n  together is the \"AI slideshow\"; a movement handed across the cut is cinema.\n- **Every video edge is a suspect; an internal cut is the model's.** Shots\n  inside a video were born in one generation — check its cuts once, on the real\n  frames, and expect them to hold. A video edge was born in two and joined the\n  handbook's way (`film-scenes/references/SEAMS.md`), so the QC there asks\n  three things: the angle and size clearly changed, the movement carries\n  across, and the level step is hidden by the bed. Then the classical list —\n  eye-lines match, the axis is not jumped, costume/props/hair continuous, tempo\n  does not lurch. Run it once at assembly.\n\n## The cut — assemble, then one review (2026-09-09)\n\n1. **Assembly** — author one scene with one track layer. Its `clips` are\n   the shots in playback order, each with an id, source reference and its\n   approved `trim`. Preserve the model's delivered cuts and the user's edits.\n   The procedure and per-seam transitions are in `references/ASSEMBLY.md`.\n2. **One review with the user.** The assembled film in `picsart_scene_editor`,\n   watched once through. What they point at is fixed: a glitch — hands, teeth,\n   a melted face — by the model's edit sibling on that clip; a bad join through\n   **Join repair** above, not an automatic re-roll; a coverage hole by a new shot\n   card back to `film-scenes` when the chosen repair needs new footage.\n   Then the cut is final when they say so, recorded in `film.json`. This one\n   review replaced the four passes (assembly, rough cut, fine cut, written\n   picture lock), the join checklist, the defect list and the full-size watch.\n   After it: no picture changes except a fix the user asks for — colour and\n   sound work on this cut, and a silent change strands them on a stale one.\n\n## Handing the fine cut to the user — `picsart_final_cut`\n\n**Check `tools/list` first; this tool is not on every server.** As of\n2026-09-19 `picsart_final_cut` is not served by the stage deployment the plugin\nconnects to — it exists, but on a branch that has not shipped. If it is absent,\n**do not call it and do not announce a console that will not open**: the\nround-trip editing above IS the fine cut, and the cut is final when the user\nsays so, recorded in `film.json`, exactly as the previous section describes.\nSay once that hands-on trimming is not available on this server and keep taking\nnotes. Everything below applies only when the tool is actually listed.\n\nEverything above is you editing on the user's behalf, one round-trip per note.\nThat is right for structure — order, coverage, which take — and wrong for the last\nhalf-second of a shot, which is faster to *feel* than to describe. So at fine cut,\nopen the **Final Cut console**: a real editor in the chat, with trim, split, crop,\nadjust, effects, resize, speed, volume and freeze.\n\n**Pass the shots, not a rendered cut.**\n\n```\npicsart_final_cut {\n  clips: [ { id: \"12A\", url: \"<shot url>\", label: \"12A Cal turns\",\n             duration: 8.4, width: 1920, height: 1080,\n             trimIn: 0.4, trimOut: 3.1 }, … ],\n  title: \"<film> — final cut\", notes: \"<what to look at>\" }\n```\n\n- **`clips` saves an export, every time.** Each shot becomes its own layer laid\n  end to end, so the console can open on the shots themselves and nothing has to\n  be rendered first. Passing a single `videoUrl` instead means a\n  `picsart_media_export` — and a wait, and another file in their Drive — before\n  *every* edit session, and it arrives as one flat strip with the shot\n  boundaries gone. Reserve `videoUrl` for a cut that genuinely is one take, or\n  for reopening a flattened master.\n- **Warn them the timeline does not show the shots yet.** One line is enough:\n  *\"the strip reads as one clip — the cut is still three shots, and Split shows\n  where the joins are.\"* The console opens on Split for exactly this reason. A\n  proper multi-clip timeline exists upstream but is parked on two editor bugs\n  (2026-08-28) — `docs/widget-specs/final-cut.md` has the detail. Until it lands,\n  a user who does not know this will read the flat strip as \"it merged my shots\".\n- **Pass `duration`, `width` and `height` per clip, and pass them truthfully.**\n  `picsart_media_probe_media` gives you all three and is free, and you already hold\n  them from the assembly. The console then skips its own probing, which matters\n  more than the round-trip it saves: a browser defers media loading in a background\n  tab, so a probe there never settles and the editor sits on \"Loading…\". Truthful\n  because these numbers become the clamp on every trim as soon as the newer editor\n  lands — an overstated `duration` promises footage that does not exist.\n- **It is free, and its render is free.** The preview and the export both run the\n  compositing engine in the user's browser, not `picsart_media_export`. The user can\n  iterate as long as they like and it costs nothing. When they save, the mp4 you get\n  back is finished — same engine that drew what they were watching, so there is\n  nothing to verify and **nothing to re-export server-side.**\n- **Keep the replay document.** Saving returns `videoUrl` *and* `replayUrl`. Drive\n  both immediately (the URLs expire), and pass `replayUrl` back on the next call so\n  they resume inside their own edit instead of restarting from a flattened file. An\n  mp4 alone throws the edit history away.\n- **Open it once the cut is DECIDED, not before.** The shot list you pass is the\n  cut's order and its keep-windows, so there has to be a cut to describe. Work that\n  changes what the cut is *made of* — swapping a take, closing a coverage hole,\n  regenerating a shot — stays a `picsart_media_*` operation on the scene, where it\n  is free and reversible. What the console is for is the frame-level fitting of\n  material you have already chosen — reordering included, since without a\n  draggable timeline there is no way to change shot order in the console.\n- **The scene editor judges AND cuts; Final Cut finishes.** The editor edits in\n  place — trim, split, delete, duplicate, adjust, speed, effects, volume, resize\n  — so \"trim it a bit\" no longer needs the console. What still separates them:\n  the editor hands back the edited scene document and renders nothing, which is\n  what keeps the next round reviewable; Final Cut renders one flattened master\n  in the browser. Send a cut to the editor for notes, regeneration direction,\n  and any recut that must stay shot-shaped. Open Final Cut at picture polish,\n  when the cut is settled and the next artefact is the master itself.\n- Full contract in `../film/references/WIDGET-FEEDBACK.md`; the widget's design\n  contract in `../../docs/widget-specs/final-cut.md`.\n\nGate line for the final cut: **if the user edited in Final Cut, the locked cut is the\nmp4 they saved** — not your assembly. Record its `stateHash` and both URLs in\n`film.json` so finishing grades the picture the user actually approved.\n\n## Assembling a scene — mechanics\n\nThe scene tools do the work: probe → author → validate → review →\nexport, condensed in `references/ASSEMBLY.md`, which is self-contained and, since\nthe `picsart-video` plugin was retired on 2026-09-10, the only version.\n\n**Read the live editing recipe before changing the scene.** Use\n`picsart_media_get_recipe({ name: \"video-editing\" })` (the current server\nalso resolves the repo's `mp-video-editing` alias), and load its relevant\nschema slices. Apply trims, crops, transitions, transforms and sound changes\naccording to that recipe, then validate and reopen `picsart_scene_editor`.\n\n**Every edit is a `picsart_media_*` operation on the scene — never a\nregeneration, and never a file the user is asked to handle.** Trim, split,\nre-order, drop a stretch, a transition, a speed or motion change, a crop, a\nsound edit: all of it exists as a compositor operation, all of it is\nbookkeeping over the source clips, and none of it spends a credit. The\nfailure this rule exists to stop is spending video rates on something the\ntimeline already does — re-rendering a shot to make it shorter, or to start\nlater, or to lose its last second, when a trim does that for nothing. If an\nedit seems to have no compositor operation, say so and ask; do not reach for\n`picsart_generate`, and do not tell the user to export it and fix it\nthemselves.\n\nThe habits that matter here:\n\n- Bootstrap, validate and **`picsart_media_export` are all free** — iterate\n  order, trims and transitions without paying, and render when you need a real\n  file rather than hoarding the call. What an export still costs is TIME (a real\n  GPU render) and a new file in Drive, so it is worth doing on a settled cut\n  rather than on every keystroke — but it is not a budget decision.\n- Before any render, put the cut in **`picsart_scene_editor` — the scene\n  editor**: the authored, validated track scene, every shot a clip in\n  playback order, passed as `scene`. The editor plays it in the browser, so the\n  user watches the real cut with nothing rendered. **The editing there is free\n  and instant** — it moves windows over the source clips, so trimming a shot's\n  edges, splitting it at the playhead and deleting it all happen live and cost\n  nothing. Only two things come back: the edited scene, and comments. Never\n  paste scene JSON at the user. The editor takes no per-shot prompt or cast, so\n  keep each clip's shot, prompt and characters in `film.json` — that is what\n  turns a comment into a retake.\n- **One editor, and it always carries the whole cut (2026-09-07).** The scene is\n  every shot in playback order. Never an editor for a single clip, never one per\n  piece of a cut the user just made, and never two open in one turn. The\n  reported failure: the user split a shot on the old review board and got back\n  one video view per resulting piece. Their own edit needs no second look to\n  confirm it — record the cut, say in one line what changed, and open the editor\n  again only for material they have not seen, with the full recut in it. If two\n  are ever live at once anyway, queue them as `film-scenes` says: one editor's\n  feedback is one item, and nothing advances until the queue is empty.\n  **Focused join comparisons are the exception:** follow\n  `references/JOIN-REPAIR.md` to review A → B against A → candidate → B without\n  changing the accepted cut. An edited or extended clip is never a lone clip in\n  the editor either: it goes into the cut, and the whole cut goes back up with\n  one line naming the seconds that changed.\n- Within a scene the default seam is a **hard cut** (`transition: \"\"`) — scenes\n  are constructed from coverage, and continuity is the cut's job. Transitions\n  belong *between* scenes if anywhere; `crossfade 0.5` is the defensible default,\n  `references/ASSEMBLY.md`'s transition table for anything else.\n- Draft exports at draft canvas (854×480). The final-resolution export happens\n  once, in `film-finishing`, after the final-res re-roll.\n- Ordinary review rounds run in that same editor, on the NEW take. Focused join\n  variants use `references/JOIN-REPAIR.md`; otherwise, if the user prefers the\n  previous attempt they say so and you put its url back in the cut yourself —\n  free. Keep every take's url in your own plan\n  bookkeeping so you can.\n- **Read its feedback as two different things.** `document` (when `edited` is\n  true) is an EDIT THE USER ALREADY MADE — the editor performs trims, splits and\n  deletions in place, so it is not a request and there is nothing to interpret.\n  `comments` (pins, each with its `layerId` and `time`) and `timelineComments`\n  (stretches, `start`/`end`) are the part that carries a requested change.\n  Diagnose each note's meaning before choosing compositor work or generation; a\n  note about a seam is not itself permission to regenerate. Combine compatible\n  notes on a shot while preserving everything the user asked to keep.\n- **Recording the cut is bookkeeping, not a render.** Read `document`'s clips\n  in playback order — the clips of the montage's `track` layer, or top-level\n  media layers in a scene built by hand — each over its source (`assetId` into `assets[]`, or\n  an inline `asset`) with `content.trim` in that file's seconds — and write each\n  window to its shot's `trim` with `trimSource: \"user\"`; a split is two clips on\n  one source, a deleted shot is a clip that is gone. Record `stateHash` beside\n  the cut, and carry `document` forward as the film's scene. Validate it\n  (`picsart_media_validate_scene`) before anything else is built on it.\n- **The old takes never move.** Nothing already in `Shots/` is moved,\n  overwritten or deleted — same rule as `Assets/`, and it is what lets the user\n  come back and edit again from the original material. A render of the cut\n  (`picsart_media_export`, when a file is wanted) goes in a new subfolder under\n  `Shots/` (`picsart_drive action=create_folder`, `folderUid` =\n  `film.json.drive.shotsUid`).\n- **The next round reopens on `document`, not on a render** — and only when\n  there IS a next round: new material, or a note that needs watching. The\n  user's own cut is not a reason to reopen (above). Apply your changes to\n  `document` (`picsart_media_patch_scene`, or a re-bootstrap from the recorded\n  windows when a take was swapped), validate, and open the editor on the result.\n  Its clips still reach into the whole source, so every handle can reach back\n  into the material this round trimmed off. Reopening on rendered clips would\n  weld each trim shut, and a shot cut a second too short could never be opened\n  back up — which is precisely what the trim handles exist to allow.\n- **Its direction speaks the shotlist board's language.** A camera move or a\n  colour named in a comment is that board's own preset name, so\n  `Slow push-in` in a note means exactly what that name meant when the shot was\n  planned — any of the 50 in `PRESETS-CAMERA.md`. It all arrives as the user's\n  words in a comment's `instruction` or a stretch's `text` — fold it into the\n  shot's prompt rather than parsing it. **Folding\n  rewrites prose, so re-read the speaking characters' voice lines off their\n  assets and keep them verbatim** (`../film-scenes/references/PROMPT-BLOCKS.md`)\n  — a reworded voice line returns a different voice, and the same applies to a\n  new shot card ordered from here.\n- **Text that belongs to the world goes on as a layer here, never into a\n  prompt (2026-09-11).** A headline on a screen, a number on a phone, a name on\n  a door, a sign in the street: the model glitches typographic text, so the shot\n  is generated without it and the words are composited over the clip, sized and\n  placed to sit in the frame as though they were always there. This is the same\n  rule `film-finishing` applies to the film's own titles — extended to text\n  inside the picture, which it never covered. The picture prompts ban invented\n  lettering for the same reason\n  (`../film-scenes/SKILL.md`).\n- **Keep dialogue and ambience/music on separate audio layers** in the scene\n  graph — that separation is what makes J/L cuts possible (sound leading or\n  trailing the picture across a seam) and lets the ambience bed carry across\n  cuts, the edit-side counterpart of the prompt's audio-tail rule.\n- **Speech-cut review on assembled dialogue scenes** (when the classic Picsart\n  plugin is installed): `video-transcribe-audio` the assembled cut and read\n  the reconstructed script AS PROSE — seams must read fluently, no dangling\n  connective or orphan pronoun across a join, no clipped word at a scene\n  edge. If it doesn't hold together as a paragraph it will not hold as a\n  scene. Without that plugin: read the cut by ear and say so.\n- **Virtual camera moves — the free camera adjustment.** The compositor can\n  animate the clip layer's own window: either the **`ken_burns` motion preset**\n  (`zoom` ≤ 1.2, `direction` `in`/`out`/a compass point, `pan` in composition\n  pixels) via `picsart_media_apply_motion_preset`, or **`animations` keyframes**\n  on `scale` / `position` / `anchor` via `picsart_media_patch_scene` — `anchor`\n  is the zoom centre. A push-in is scale rising, a drift is position gliding, a\n  punch-in is two scale keyframes ~0.1s apart. Exact shapes in\n  `references/ASSEMBLY.md`. No new pixels —\n  staging and validating are free, and the cost rides inside the export the\n  film already buys. Use it when a good take has a dead camera, to recentre a\n  drifted composition, or to Ken-Burns the animatic stills. **Honest\n  limits**: 2D only (no parallax, no orbit — it reads as zoom, not dolly);\n  keep zoom ≤ ~15–20% or the resolution loss shows (the finishing upscale\n  masks some of it); nothing exists beyond the source frame, so a pull-out\n  only works on takes generated wide (see `film-scenes`' generate-wide\n  note). Wrong move or wrong energy is a camera-change retake in\n  `film-scenes`, not a crop. The desperate last resort — a video-edit model\n  re-rendering the clip with a different camera — is charged and risks the\n  identity; name it as such if ever offered.\n- **Verification is bounded: two fix rounds, then deliver.** For focused join\n  experiments, use `references/JOIN-REPAIR.md`'s stopping rule instead; a rejected\n  candidate never becomes the cut merely because two rounds elapsed. One round = look\n  once (a scene review or a contact-sheet spot-check, not both), fix EVERY\n  failing join in ONE rebuild. After the second round, export what you have\n  and say in one line what is still weak — a flawed delivered cut beats a\n  perfect undelivered one, and ending a session with no film is the worst\n  outcome. This bounds the VERIFICATION loop only — a shot's 10–15 generation\n  iterations in `film-scenes` are a different budget and keep their own rule.\n\n## Cleanup — inside the one review (2026-09-09)\n\nWhat generation spoiled — extra fingers and teeth, drifting objects, boiling\ntextures, edge jitter, random pseudo-text — is fixed when the user points at\nit in the review. The repair path is the **edit sibling** (`film-scenes` step\n5): the clip, the defect named to the second (\"shot 3, 14–16s: five fingers\non the left hand\"), the same numbered references — nothing else. Swap the fix\ninto the cut and watch the whole stretch in `picsart_scene_editor`, not only\nthe defect — an edit can fix the hand and lose the light. A defect the edit\nsibling will not take in two tries is a re-roll of the run. If the model will\nnot give the shot back clean in 2–3 tries, the honest fallbacks are a recut\naround it (a cutaway or a tighter trim — free) or accepting it, said out loud.\nFrame-by-frame retouch is a real path only outside this surface.\n\nGate out: the user has called the cut final · shot order and trims saved to\n`docs/` · everything durable on Drive. Route to `film-finishing`.\n\n## Costs\n\n| Free | Charged |\n|---|---|\n| bootstrap, re-bootstrap, `picsart_media_validate_scene`, `picsart_media_query_layout`, `picsart_media_probe_media`, `picsart_media_apply_scene_template`, **`picsart_media_export`**, `picsart_scene_editor` (the scene editor — playing the cut, and trimming, splitting, deleting and commenting on a shot are all free, happen in the browser and render nothing), `picsart_final_cut` **including its render** (the engine runs in the user's browser, so editing and exporting there both cost nothing — unlimited iteration), all planning | every cleanup regeneration (`picsart_generate`) |\n\nThe one charged thing here is a cleanup regeneration, and it routes through\n`film-scenes` step 5 — so it carries that skill's rule: preflight, the number to\nthe user, then the yes. A fix nobody priced is still a purchase (2026-09-07).\n\nExport is a real GPU render, so it costs time and makes a file — spend it on a\nsettled cut, not on every keystroke. It does not cost credits.\n\n## Traps\n\n- Editing only after all generation ends. The parallel edit is where coverage\n  holes are found while they are still cheap.\n- Cutting from the raw pile because selects lag. Fix the selects.\n- Re-exporting to answer \"what if\". Export costs no credits, but every render\n  takes real time and leaves another file in the user's Drive — re-bootstrap and\n  the scene editor answer the question sooner and leave nothing behind.\n- Re-exporting a Final Cut save through `picsart_media_export` \"to make it real\".\n  It already is: the browser rendered it with the same engine. That render buys a\n  second copy of a file you were handed.\n- Opening the scene editor per clip, or once per piece after the user cuts in\n  it. The editor is the whole cut, once — anything else is the same picture\n  shown back several times, and only the first send gets answered.\n- Locking your assembly after the user edited in Final Cut. The cut they saved is\n  the cut; grading the wrong one strands finishing on a stale picture.\n- Picture changes after lock without telling finishing.\n- Grading before cleanup — the colorist grades shots that are about to be\n  replaced.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}