# Skills audit — 2026-09-09

Every file under `skills/` (22 files, 7,750 lines) read in full, in five passes by
theme, plus mechanical checks (cross-references, tool names against the 46 tools
the stage server serves, `film.json` keys, widget feedback versions against the
widget code) and the live model catalog. Nothing was changed. This file is not
committed; it is the list to pick from.

Line numbers are as of commit 4d3f2c9 on picsart-film.

**Fixed on 2026-09-10 (user-approved):** A.1–A.12 (A.8 reworded to "read the
schema"; A.12 as "picks the user made go into the shot block"), B.16 (block
names in the preset files), B.38, B.46, B.47 (Stages 2 and 3 folded into
Stage 1), B.36 (example record), plus: models named as families with the ids
recorded in `film.json.model.pictures`; never drop references silently. Left
by the user's decision: everything in C except C.8, and the rest of B.

---

## A. Would break a film today

A chat that follows these lines makes a wrong or refused call, or two skills tell
it opposite things about the same step.

1. **The prompt carries the descriptor — or it does not.** `film/SKILL.md:570`
   (rule 2, "the descriptor is copied verbatim into every prompt"),
   `film-assets/SKILL.md:43–44` ("pasted verbatim into the references header"),
   `film-scenes/SKILL.md:1266` (trap: shortening it) and `PIPELINE.md:353` say yes.
   `film-scenes/references/PROMPT-BLOCKS.md:56–57` ("No descriptor is pasted
   anywhere in the prompt") and `film-scenes/SKILL.md:672` say no. Two prompt
   shapes are documented at once; the newer one (2026-09-09) is the pictures-only
   one, and a rule that "never bends" orders the old one.

2. **The vintage portrait is asked at a ratio the model refuses.**
   `film-assets/references/ASSET-SHEETS.md:241` ("Vintage path: `gpt-image-2`,
   16:9"), also `:171`, `:250`, `film-assets/SKILL.md:191`, `PIPELINE.md:177`.
   `film-scenes/SKILL.md:731–732` records that this model "rejects the film's
   widescreen ratio (`size has wrong value`, 2026-09-08)". The schema lists 16:9,
   so preflight passes and the provider refuses after the wait. Every film on the
   six era tones fails at its first portrait.

3. **The run example breaks rule 7.** `film/SKILL.md:405–410`: the refs are
   `cal-front`, `tobin-front` (identity only, no wardrobe view for either) and
   `START FRAME` is the fifth picture (rule 7 at `:600–603` says the frame is
   picture 1). The example is what the chat copies. The newer rule wins.

4. **The reference ladder drops what rule 7 keeps.**
   `ASSET-SHEETS.md:736–741`: "hold under 15 MB and 6–8 images… 1. Drop stills.
   2. Drop wardrobe views." `film-scenes/SKILL.md:610–613`: "the old 6–8 cap is
   gone (2026-09-08)… identity and wardrobe views never leave". Following the
   older ladder reproduces the bridge-clip wardrobe change.

5. **Two opposite repairs for a blended two-shot.** `ASSET-SHEETS.md:771–774`:
   generate each person alone, composite them, pass the composite as `FRAME
   REFERENCE`. `film-assets/SKILL.md:357–360`: "Not a composite of two solo
   renders" — fewer references, medium two-shot, Seedream. Both are dated
   current.

6. **Sheets and plates still travel in `imageUrls`.** `film/SKILL.md:709`
   ("enough slots for every asset sheet, plate and approved still"),
   `PIPELINE.md:255` ("every asset sheet and plate in `imageUrls`… spelling out
   its every console choice"). `film-scenes/SKILL.md:110` ("never a multi-panel
   sheet"), `ASSET-SHEETS.md:563` ("views, not sheets"), `PROMPT-BLOCKS.md:128–130`
   ("no restated console values"). A sheet in `imageUrls` is the panel-pointer
   dispatch error.

7. **The Kling shape uses the start-frame field.** `PROMPT-BLOCKS.md:132–150`:
   15 s generations, two images, "`Use start frame @`", dialogue shot speaker by
   speaker. Rule 7 says the `startFrame` field is never filled on any clip;
   `film-scenes/SKILL.md:161–166` says no film shoots shot by shot; the model
   policy (`film/SKILL.md:705–725`) requires multi-shot and edit/extend siblings,
   which Kling lacks. Either the section says Kling is outside this pipeline, or
   it goes.

8. **The duration ladder is asserted, the schema says otherwise.**
   `film-scenes/SKILL.md:259` ("Seedance 2.5 takes 4/5/6/8/10/12/15/20/25/30 and
   has no 7"), `:656`. Live `picsart_model_params`: `duration` min 4, max 30,
   step 1. Only the run total (`genSec`) reaches the model, so the doc's own
   "7 s card snapped to 8 s" example is moot: a shot packs into a run. What
   remains: if the schema is right, "snap the run up the ladder" buys seconds
   nobody needs; if the doc is right, preflight lets a 27 s run through and the
   provider refuses after the wait. **Settled 2026-09-10:** a 7 s call was
   accepted and delivered at 7.04 s. The schema is right; the ladder note is
   gone from the doc.

9. **Dependent-run frames replace the room's pictures but say nothing about the
   people.** `film-scenes/SKILL.md:1176–1180`: the exported frames "replace that
   place's pictures… scene picture, coverage, and the map". A character who is
   now dusty or torn keeps a clean wardrobe view beside the frame — exactly the
   averaging `PROMPT-BLOCKS.md:227–230` warns about. No line says the state view
   replaces the wardrobe view.

10. **Rule 7 has no answer for a photo-sourced person.** Rule 7 demands an
    identity view and a wardrobe view of every person. `film-scenes/SKILL.md:596–598`
    and `ASSET-SHEETS.md:573–575`: for a photographed character the photo is the
    identity image and the sheet is skipped when the photo shows what the cuts
    need. What is the wardrobe view then — the photo again, a crop, nothing?
    Unstated.

11. **A prop's plate is paid for and never used.** `film-assets/SKILL.md:58`: "A
    prop: one plate, judged on the same board." `film-scenes/SKILL.md:772`: "no
    prop plate" in the scene picture's references; `:672`: no descriptor in the
    prompt. The plate reaches no picture and no prompt; only the *Visible* line
    carries the object. Rule 7 covers people; the flask that drifted is still
    uncovered.

12. **The board's pills, the card's fields and the shot block do not match.**
    `BREAKDOWN.md:22–25` card = Size, Movement, Lens, Angle.
    `WIDGET-FEEDBACK.md:382–396` board = size, move, lens, light, palette, sec;
    `:400–401` angle/height are pass-throughs with no pill.
    `film-development/SKILL.md:117–119` says the user changes "angle" on the board.
    `film-scenes/SKILL.md:415` "six decisions — size, camera move, lens, light,
    colour, length"; `PROMPT-BLOCKS.md:128` the shot block carries none of lens,
    light or colour. The preset files still say they do: `PRESETS-CAMERA.md:452`
    "Degrees are what goes in the prompt", `PRESETS-LIGHTING.md:134` "written
    straight into the scene picture's prompt" (the thirteen-line template at
    `film-scenes/SKILL.md:754–766` has no lens or light line),
    `PRESETS-ACTING.md:6` compiles the wheel into "the Character acting block
    (12)" while `PROMPT-BLOCKS.md:101` allows "one or two words per visible
    face". Lens, light, palette and the acting wheel are chosen and reach nothing.

## B. Misleads the chat

Stale or self-contradicting text. A chat reading it runs the wrong ceremony,
names the wrong file, or quotes the wrong number.

13. **Project folder tree is pre-story.** `film/SKILL.md:244–246`: `script.md
    (the scenes as written)`, `prompts/ … per shot: sc01_12A_v3.md`. Stage 1 now
    writes `docs/story.md` (`film-development/SKILL.md:49`), one prompt per video
    (`film/SKILL.md:592`). `brief.md` (`:251`) and `pitch.md`
    (`film-development/SKILL.md:251`) overlap the story document with no rule on
    which is canon. `DISCLOSURE.md` is missing from the tree and has two homes
    (`film-finishing/SKILL.md:127` under `docs/`, `DELIVERY.md:51` in the rights
    folder).

14. **The pipeline map names Stage 1 by its last step.** `film/SKILL.md:204–206`:
    "1 | Shot list", "3 | The film's look". Stage 1 is console, story, model,
    plan, board (`:124–136`); the look locks at Stage 1 step 2
    (`film-development/SKILL.md:20`).

15. **Voice policy "decided at the bible lock".** `film-scenes/SKILL.md:691–692`,
    `film-finishing/SKILL.md:66–67`, `SCREENWRITING.md:45–46`.
    `film-development/SKILL.md:241`: "The voice policy is `native`, and there is
    nothing to decide."

16. **Names from the deleted fifteen-block template.** `film-scenes/SKILL.md:454`
    ("blocks 8, 9 and 10"), `:652` ("Block 11"), `:1195` ("block-7 recompile"),
    `:1269`, `PIPELINE.md:355`, `SEAMS.md:168` ("blocking block");
    `PRESETS-CAMERA.md:4–7` "(7)… (6)… (4)", `PRESETS-LIGHTING.md:6` "block
    (10)", `PRESETS-ACTING.md:6` "block (12)". `PROMPT-BLOCKS.md` has no
    numbered blocks.

17. **Stage 3 re-describes Stage 1 work.** `film-development/SKILL.md:230–234`:
    "Compile the style prefix, store it verbatim in `bible.stylePrefix`… the
    script is rewritten first". The console compiles the prefix at Stage 1
    (`:30–31`, `WIDGET-FEEDBACK.md:22–23`); the word is story.

18. **Runtime measured three ways.** `DRAMATURGY.md:39–40` seconds per scene at
    ~2.5 words/s + 1 s; `SCREENWRITING.md:97–98` "Count runtime in shots, not
    pages"; `film-development/SKILL.md:172` "A script page is roughly a minute".
    The story document has neither pages nor shots.

19. **A supplied script gets no seconds.** `film-development/SKILL.md:109–113`:
    "Nothing else is reviewed; the video model and the video plan follow." The
    plan is written against per-scene seconds (`DRAMATURGY.md:39`); no step
    gives a supplied script its seconds.

20. **Contact sheets free and charged in the same file.**
    `film-scenes/SKILL.md:1170` "(up to eight thumbnails, free)", `:1258` free
    column; `:1225` "contact sheets are charged per frame", `film/SKILL.md:776`
    charged.

21. **Where the handle seconds live is unstated.** `film-scenes/SKILL.md:504`:
    skip handles "only when the run is already at the model's ceiling"; `:326`:
    every video fills "up to the model's live ceiling". No line says whether the
    two-second handle sits inside `genSec` or on top of it. The worked prompt
    (`PROMPT-BLOCKS.md:262`) sums to 28 s with no handle seconds while the
    dispatch checklist (`:175`) wants shot seconds to "sum to the video's
    length"; `film-edit/SKILL.md:35–38` and `PIPELINE.md:263` plan around handles
    that exist.

22. **Stop rules for retries are scattered and unlabelled.**
    `film-scenes/SKILL.md:141` (edit: two tries), `:782` and `:1285` (picture
    faces: never a third roll), `:1014` (runs: four or five), `:1119` (shots:
    third attempt → split). Different objects, but nothing says which rule
    applies to which.

23. **The zero-memory word list differs by file, and the join line breaks it.**
    `PROMPT-BLOCKS.md:190` bans "still"; `SEAMS.md:25` example "still moving
    right"; `film-scenes/SKILL.md:1310` shorter list; `SEAMS.md:96–98` the
    canonical join line "picks that movement up from this new angle" refers to
    the other video.

24. **`EXACT 2 CHARACTERS — NO DUPLICATES.` is hardcoded** in the template
    (`PROMPT-BLOCKS.md:34`). A three-person video pastes the wrong count.

25. **Widget contract text vs widget code.**
    `WIDGET-FEEDBACK.md:97` `asset_review_feedback` "at v3" — code
    `widgets/src/asset-review/feedback.ts:30` is `version: 4`. No
    `model_choice_feedback` section exists (code v1) though `picsart_model_choice`
    is used in Stage 1. `:321`, `:382` "seven values" — six are listed. `:210–211`
    "the shot list's Length control offers exactly the durations the chosen model
    accepts" — under the run doctrine a shot's `sec` is a cut length inside the
    run, not a model duration; only `genSec` is (`:396` fixed `sec` 3|5|7|8|10|12).
    `:151–153` "`cut.order`… no longer sent" — `:113` example carries
    `"order": 3`, `film-edit/SKILL.md:174`, `:249` reorder in place.
    `:486`, `:489` render-monitor example still `seedance-2.0`.

26. **Camera-move count: 48, 50 or 51.** `film-edit/SKILL.md:293` "any of the
    51", `WIDGET-FEEDBACK.md:408` "all 48 ids", `docs/widget-specs/shotlist-board.md`
    "51" / "48-option" / "fifty" (the other session's uncommitted text).
    `PRESETS-CAMERA.md:19` and `widgets/src/camera-moves.ts` both have 50; the
    board shows 32 of them (C.9).

27. **"Tier 1" is used and never defined.** `WIDGET-FEEDBACK.md:505–507`,
    `film-scenes/SKILL.md:423`, `PRESETS-LOOKS.md:572`, `:597`,
    `PRESETS-CAMERA.md:25`, and a "Tier-1 use" section in each of
    `PRESETS-CAMERA.md:572`, `PRESETS-LIGHTING.md:214`, `PRESETS-ACTING.md:83`.
    It is defined only in passing (`PRESETS-LOOKS.md:597` "no console on the
    server", `WIDGET-FEEDBACK.md:503–505`), never in `film/SKILL.md`, and it
    shares its word with the deleted asset and complexity tiers
    (`film-assets/SKILL.md:50` "no tiers"). `WIDGET-FEEDBACK.md:505–507` says shot
    design and acting run as the host's question interface menus though the shot-design
    panel is retired. See C.1 for why this matters.

28. **`picsart_music_studio` is not a served tool.** `film-finishing/SKILL.md:100`.
    The fallback in the same line works (`picsart_generate` with
    `elevenlabs-music-v2`, `minimax-music-v3` or `lyria-3-pro`). The Stage 10 bed
    sits correctly beside the prompt's no-music line: one stops music inside the
    clip, the other adds a bed later.

29. **An upscale that exists and one that does not.** `film-edit/SKILL.md:318` "the
    finishing upscale masks some of it"; `film-finishing/SKILL.md:146` "Calling the
    final pass an upscale. It is a fresh roll." `film-finishing/SKILL.md:20–26`
    "upscale FIRST… then re-assemble at ≤1920×1920" — pixels above 1080p cannot
    ride through that export.

30. **480p hardcoded.** `ASSEMBLY.md:67` "Draft canvas 854×480 to match 480p
    drafts", `film-finishing/SKILL.md:10`, `film/SKILL.md:14`;
    `film-scenes/SKILL.md:681` drafts at the finish resolution when the price is
    the same.

31. **Export billed in two places.** `ASSEMBLY.md:56` "Free look-checks before a
    charged one", `film-edit/SKILL.md:314` "the cost rides inside the export";
    `film-edit/SKILL.md:209` export is free.

32. **Rough cut and solo takes as the normal unit.** `PIPELINE.md:349` gate "The
    run roughly cut" vs `film-edit/SKILL.md:20` rough cut off.
    `PIPELINE.md:363–364`, `film-edit/SKILL.md:79–83` "a solo take is generated
    10–15s and cut to 3–8s" as the ordinary case; the run is the unit.

33. **Step 7 works in scene batches.** `film-scenes/SKILL.md:1242–1246` "While
    scene N iterates, shotlist N+1" vs one film-wide shot list and every
    non-dependent video dispatching together (`:319–352`).

34. **One board or two for the cast.** `film-assets/SKILL.md:3`, `:165` one board;
    `:8`, `:196`, `PIPELINE.md:146` two boards.

35. **"Pictures with people on seedream-5.0-pro" reads as covering portraits.**
    `PIPELINE.md:296`. Portraits and sheets are on `gpt-image-2` /
    `gemini-3.1-flash-image` (`film-assets/SKILL.md:198–201`). The word "scene"
    is missing.

36. **The asset example is the 2026-09-04 sheet.** `film/SKILL.md:437–447`: a 4K
    gridded six-panel PNG sheet, a face view cut from the sheet's panel.
    `ASSET-SHEETS.md:33–39` three generations (portrait, profile, T-cut sheet),
    `:167` JPEG never PNG, `:626` "face panels are never the source of a view".
    `film.json.model.roles` (`:421`) has `facesAndLocations`, `pointEdits`,
    `textInFrame`; the last is used nowhere and no slot records the two picture
    models (people on Seedream, map on GPT).

37. **A date before the thing it dates.** `film/SKILL.md:693–694` places the
    model pick "before the video plan is written (2026-09-03…)"; the video plan
    is from 2026-09-09.

38. **Stage 2 boards decide a camera Stage 1 already approved.**
    `VISUAL-BIBLE.md:27–29` "how a scene is shot is fixed in advance precisely by
    these boards — from them the shotlist and prompts are written". The shot
    list is Stage 1 step 6.

39. **Input pixel limit.** `film-scenes/SKILL.md:608` "declares no input pixel
    limit" vs `:1127` and the live 300–6000 px height rule.

40. **"Generate one size wide when the shot can afford it."**
    `film-scenes/SKILL.md:477` — the board approved the size; this changes it
    silently, which `:259–262` calls "an approved plan being quietly changed".

41. **Pointers that point the wrong way.** `film-scenes/SKILL.md:688–694` "see the
    next section" (the audio section is above, `:511`); `:650` "(see step 3)" for
    a scratch mix.

42. **Vocabulary drift in BREAKDOWN.** `BREAKDOWN.md:12`, `:40`, `:53` "script";
    `:22` size ladder ECU→WS is a subset of the board's
    (`WIDGET-FEEDBACK.md:383`).

43. **ASSET-SHEETS leftovers.** `:466` "A plate (2-shot locations, props)" —
    locations left Stage 4 (`:430`); `:155–163` vintage views under the 1024 px
    floor are "reported, not repaired" vs `:663–664` "never cross".
    `film-assets/SKILL.md:378` costs a sheet twice ("one sheet or plate per…"
    and "a portrait, a profile and a sheet per character").

44. **Dead or fragile paths.** `PRESETS-CAMERA.md:15`
    `../../docs/widget-specs/shot-design-panel.retired.md` resolves to
    `skills/docs/…` (needs one more `../`). `ASSET-SHEETS.md:380`
    `PRESETS-LOOKS.md` named without a path (it is in `film/references/`).
    `film-scenes/SKILL.md:1122`, `WIDGET-FEEDBACK.md:100`, `:266` point the review
    contracts at `../../../picsart-video/skills/video-from-idea/references/REVIEW-FEEDBACK.md`
    — the sibling plugin; a film-only zip ships without it.

45. **Board fallback invites action edits.** `film-development/SKILL.md:155–158`:
    without the board, "a markdown table per scene with one 'anything to change
    in any scene?'". No fallback form is stated for camera-only or for the
    story-note rule.

46. **Three files say the console owns the Light pill.** `WIDGET-FEEDBACK.md:177–178`
    "Its presets are what the shot cards' lens, light and colour pills offer",
    `film/SKILL.md:129–130`, `film-development/SKILL.md:31–32`. The console has
    no light preset (`PRESETS-LOOKS.md:282–306`, lighting is per shot); `Light`
    comes from `lighting.ts`.

47. **When the look locks: four answers.** `film/SKILL.md:125` Stage 1 ("the look
    console, locked"); `PRESETS-LOOKS.md:27` "at the Stage 3 gate";
    `WIDGET-FEEDBACK.md:188` "satisfies the Stage 3 gate item";
    `film-development/SKILL.md:264` "the lock is the sheet approval in Stage 4".

48. **Two arrangement fragments differ between doc and widget lib.**
    `PRESETS-CAMERA.md:432` (over-the-shoulder, "their back visible, in front of
    them is <subject> <subject's character view>") and `:438` (POV, "only their
    hands are visible") carry the 2026-09-08 handbook wording;
    `widgets/src/shot-sizes.ts:128` and `:133` still carry the old sentences. The
    doc is the source of truth; the lib was not re-transcribed.

49. **Camera moves "serve the film-setup console's world default".**
    `PRESETS-CAMERA.md:19–21`. Movement left the console on 2026-08-31
    (`PRESETS-LOOKS.md:531–545`; `camera-moves.ts:17–19` "Film setup was a fourth
    reader and is not any more").

50. **Emotion intensity default is 1 and 2.** `PRESETS-ACTING.md:15–16`
    "Intensity 1 is… the default" vs `:30–32` "A surface with no intensity
    control… uses intensity 2" and `emotions.ts` `DEFAULT_INTENSITY = 2`.

51. **Small preset-file slips.** `PRESETS-CAMERA.md` shot-size ladder (from
    `:386`) says "Nine rungs, wide to tight" — the table runs tight to wide. `PRESETS-CAMERA.md:363` "If you are
    generating a start frame too" never says the frame rides as picture 1
    `START FRAME` in `imageUrls` (rule 7). `WIDGET-FEEDBACK.md:337–338` "the same
    lists the film-setup console and the review board draw… and rhythm" — the
    console draws none of them and rhythm is retired. `VISUAL-BIBLE.md:15–29`
    still gathers "Cutting tempo" references nothing reads.

52. **Widget help text the user sees is stale (server repo).**
    `widgets/src/shotlist-board/presets.ts:281` help text "The same eight the
    film-setup console offers" (seventeen palettes); `:259` comment "SEVEN, not
    nine" (six controls);
    `:10–13` says seventeen, then "whichever of the eight";
    `widgets/src/film-setup/presets.ts:655` Tone hint "it sets the camera, lens
    and colour" (also focal length and aperture, `:541`). Comment-only leftovers:
    `film-setup/presets.ts:9`, `:23`, `:556`, `:827`, `:1010`,
    `shotlist-board/presets.ts:22`.

## C. Limitations the docs should state

Platform facts, not wording. Each needs a sentence in the right place, or a
server or widget ask.

1. **The film boards exist only on the stage branch.** At the launch freeze main
   served 34 tools and `film-ux-polish` 50; main's head today (fd5fbcd) was not
   re-counted here. If main still serves the pre-film tool set, every board
   line on production falls through to the "tier 1" fallback the docs no longer
   define (B.27). Highest impact of anything here.

2. **Drive does not keep the bytes.** The durable re-host is refused ("User not
   authorized"); Drive registers the CDN link verbatim, `durability: 'expiring'`.
   Lines that promise otherwise: `film/SKILL.md:262` ("nothing ever lives only
   on a CDN"), `:340` ("the difference is not durability"), `:797–799` ("the save
   re-hosts"), `film-edit/SKILL.md:348`, `film-finishing/SKILL.md:112`,
   `DELIVERY.md:41`, `WIDGET-FEEDBACK.md:451`. Only `film-assets/SKILL.md:297–303`
   is honest.

3. **A failed job's charge is unknown.** Job status carries no cost.
   `WIDGET-FEEDBACK.md:495–499` "regenerate only `failed[]`" — nothing warns that
   the regenerate may be a second charge. Server ask: charged/not in the failure
   payload.

4. **`gpt-image-2` lists 16:9 and refuses it.** Preflight passes, the provider
   rejects after the wait (A.2). Server ask: drop 16:9 from that model's enum or
   refuse it in preflight.

5. **`returnLastFrame` exists on seedance-2.5 and no skill uses it.** The only
   last-frame path given is a native-size `picsart_media_export` or a charged
   contact sheet. Worth one probe: if it returns the frame at delivery size, the
   changed-place handoff gets cheaper.

6. **Video upscalers have bounds the docs do not mention.** `flux-video-upscale`
   takes sources ≤ 20 s and ≤ 2K; runs are 30 s. `topaz-upscale-video` and
   `bytedance-video-enhance` exist. `ltx-2.3-a2v` (`film-finishing/SKILL.md:87`)
   is 2–20 s.

7. **`picsart_save_asset` does not auto-cut views.** Still open (panel geometry).

8. **The plugin zip is not rebuilt.** The film chat still loads the pre-2026-09-09
   docs; everything fixed today is invisible to it until the zip is rebuilt.

10. **Widget ask (2026-09-10): drop the per-character emotion picks from the
    review board's direction panel.** The chat writes the emotion words from the
    acting wheel; the user is not asked. Until the widget changes, a pick that
    arrives is read as a note, not a control.

9. **The board lists 32 of the 50 camera moves.** `widgets/src/camera-moves.ts:695`
    `PREVIEWED_ONLY = true` hides every move without a preview tile: pedestal,
    low tracking, roll, dolly counter, crane down, push through, snap tilt, drop
    reveal, through glass, mirror / insert POV, helicopter pull, robot arm, rack
    focus, infinite zoom, earth zoom out, time-lapse, tilt-shift glide, pass
    through. `roll` was added on 2026-09-08 for the handbook's "Camera Rolls
    Clockwise" and cannot be picked. `WIDGET-FEEDBACK.md:406` admits the filter;
    `PRESETS-CAMERA.md:13–21` does not. Move previews are still owed.

## D. Checked and consistent

- Stage 1 order and six steps: `film-development/SKILL.md:13–76`,
  `film/SKILL.md:124–136`, `PIPELINE.md:17–58`; "step 3 of 6" matches.
- `runs[]` skeleton `id, scenes, genSec, join` identical in four places; the
  run example carries `join`.
- Story note → rewritten paragraph, never a board: five files agree.
- `imageUrls` only, `startFrame` empty, picture 1 = `START FRAME`: rule 7,
  `film-scenes/SKILL.md:554–597`, `PROMPT-BLOCKS.md:154–171`, `SEAMS.md:53–57`,
  `PIPELINE.md:306–309`, model policy — all agree (the example in A.3 is the
  exception).
- Edge = angle change + carried movement, no frame copying, parallel dispatch,
  one dependent-run exception: `film-scenes`, `SEAMS`, `PIPELINE`, `film-edit`
  agree.
- Extend / edit / re-roll routing agrees across `film-scenes` step 5, `SEAMS`,
  `film-edit`, `PIPELINE`.
- Ceiling 30 s, ~2.5 words/s + 1 s, 300 px floor, 1280 px check copies,
  2048 px cap, 3 MB per file, 15 MB total: one value each, no conflicts.
- Views cut at lock, JPEG q85, `content.bounds` mandatory, panel pointer =
  dispatch error: identical in `film-assets`, `ASSET-SHEETS`, `PIPELINE`,
  `film-scenes`.
- Scene-picture chain (medium two-shot base, views only, look before deriving,
  sides off the master, two face failures → change set/model, one board):
  `film-scenes:743–843`, `PIPELINE:292–308`, `film-assets:357–360` agree.
- The room map is asked at 1:1, which `gpt-image-2` accepts; no doc asks
  `seedream-5.0-pro` for 4K (its max is 2K).
- Rough cut off, one review, export free, final cut renders in the browser,
  `shotlist_board_feedback` v3, the take-review board's feedback v2, `film_setup_feedback`
  v3, `final_cut_feedback` v1 match the widget code.
- Pace text and "every charged video dispatch is quoted and approved" agree.
- Preset libraries vs widget code, character for character: 10 genres,
  17 palettes, 7 tones + auto (same `sets` and clauses), 13 cameras, 10 lenses,
  6 focal lengths, 6 apertures, 5 frames, 2 handles; 50 camera moves incl.
  `roll` and `handheld shaky`; 10 FOV anchors; 9 angles incl. the three handbook
  additions; 9 shot sizes; 17 lighting setups; 8 × 3 emotions. Every "older
  id" and "retired id" row has an alias in the code. No music, grain, framing,
  shot-length, movement or pace control on the console. A24 absent.
- No "matches the book" claims anywhere in `skills/`.

## E. Live facts used (stage server, 2026-09-09)

| Model | Fact |
|---|---|
| seedance-2.5 | `duration` 4–30 step 1; `imageUrls` ≤ 30, `videoUrls` ≤ 10, `audioUrls` ≤ 10; `startFrame`, `endFrame`, `returnLastFrame` exist; 480p/720p/1080p |
| seedance-2.5-video-extend | up to 10 clips |
| seedream-5.0-pro | 1K / 2K only; `imageUrls` ≤ 10 |
| gpt-image-2 | no resolution control; `imageUrls` ≤ 5; enum lists 16:9, backend refuses it |
| gemini-3.1-flash-image | 0.5K–4K; `imageUrls` ≤ 14 |
| music | elevenlabs-music-v2, minimax-music-v2/v3, lyria-3-clip, lyria-3-pro |
| SFX | elevenlabs-sfx (≤ 15 s), kling-t2a (3–10 s) |
| video upscale | flux-video-upscale (source ≤ 20 s, ≤ 2K), topaz-upscale-video, bytedance-video-enhance |
| served tools | 46; not served: picsart_music_studio, picsart_video_compare, picsart_asset_sheet, picsart_shot_designer, picsart_grade_console, picsart_film_tracker |
