The clip contains the right images in the wrong order.
Correct only the manifest order and its index-to-filename binding, then rerun preflight before encoding.
Hands-on recipe
Build a review clip from existing still frames with an explicit two-FPS schedule. This is forward sequence assembly, with no generated in-between frames or reverse video frame extraction.
Includes executed local fixtures, scripts and receipts. These checks do not represent a video-generation service run.
node run-recipe.mjs --out ./my-run
Generate the three practice PNGs and an explicit ordered manifest. Each row contains an index, exact basename and SHA-256. Do not rely on filesystem iteration order, which is not the editorial order of shots.
Before encoding, replay a swapped-row manifest, remove frame 2 temporarily, add frame 5 and supply a wrong hash. Each invalid case fails; finally blocks restore the original complete sequence before the actual encode.
Use -framerate 2 -start_number 1 with frame-%04d.png and an explicit three-frame output cap. The encoder creates review.mp4 using yuv444p and no audio. Each source PNG contributes one frame; the intended duration is 1.5 seconds.
Fully decode the MP4 and confirm exactly three 160×90 RGB frames. Sample the central field of every frame against its intended red/green/blue input within four channel values. The recorded worst difference is one; no interpolation was added.
Correct only the manifest order and its index-to-filename binding, then rerun preflight before encoding.
Restore the missing original PNG at the exact basename and hash. Do not silently duplicate its neighbour.
Change only the declared input framerate and document the new expected duration; preserve the three input identities and rerun frame-order checks.
Keep sequence.json beside the assembled review. This fixture proves the chosen order and frame count; it does not create motion, extend frame holds beyond the chosen rate or qualify a distribution codec.