Derive the last frame from the locked first
You give it the locked first frame, a character sheet per person in it, and the end
state as a numbered list of changes; you get four takes of the same frame a few seconds
later. Because it is an edit of the first frame, the two match (face, hair, cuffs,
props, grain) without a second swap, and a video pinned to both doesn't morph between
them. Use it for every shot that pins a last frame. Then crop it with
python-match-push-in before anything else.
Inputs
- The locked first frame (the approved pick, 1080p).
- One character sheet per person in the frame, with who it is ("the woman at the desk (dark curly hair, green cardigan)", "the bald man in the shirt and tie").
- The end state as single changes, one per line.
- What must not change (
keep): "the woman's face, hair and cardigan; the manager's tie and glasses; the desk, monitors and windows". - How much later, in seconds (the shot's length).
Never give the source's own last frame as a composition reference: Pro puts the source's actor and props back in. Text edits only.
Run it
Call describe on the model before its first run in a job. Four takes, one call each,
seeds 7700 to 7703:
run(model="fal/fal-ai/nano-banana-pro/edit",
input={"prompt": <the later-frame prompt>,
"image_urls": ["<job>/stills/shot09_first_p.png", "<job>/references/sheet_b.jpg",
"<job>/references/manager_sheet.jpg"],
"aspect_ratio": "16:9", "resolution": "2K", "num_images": 1, "seed": 7700,
"output_format": "png", "safety_tolerance": "5"},
into="<job>/stills/lastframe", unit="shot09_last")
Keep the 2K outputs: python-match-push-in crops from the 2K render.
Prompt
Image 1 is the first frame of a shot from a live-action commercial. Image 2 is a character sheet of {who 1}. Image 3 is a character sheet of {who 2}.
Produce the LAST frame of this shot: image 1 about {seconds} seconds later. Change exactly these things:
1. {edit}
2. {edit}
Keep everything else exactly as in image 1: {keep}; the room, light, color grade, sharpness and fine film grain. Do not soften, blur or smooth anything; keep the film grain over the whole frame. Photorealistic, like a real frame from the same shoot.
Edits are end states, concrete and one per line: "The copier at the back left has its lid closed." "Papers lie scattered across the desk and the floor in front of it." "Her eyes are open, looking down at the tumbler in her hands."
Then, in order
- Push-in. Pro keeps the framing whatever the prompt says ("the camera has pushed in
10%" is ignored), and a pinned pair with no zoom loses the source's camera move. Crop
the 2K render with
python-match-push-in(about 6% on a slow push-in). - Print. Fix any logo on the cropped last frame with
nano-banana-rerender-small-print, matched to the first frame's at the same scale. - Gate. Flip first and last on a review page before animating: hair, cuffs, props and
eyes continuous, the end state right, grain the same. A small mismatch is a
nano-banana-targeted-fixwith a crop of the first frame as the reference.
Drawn shots
For a cartoon, replace "live-action commercial" and the grain and photorealism lines
with the look's medium and finish lines (guide-design-a-set, Drawn sets). One step
works well (sit down, pass the ball, land a jump). Several positions along a path:
derive each one straight from the first frame, saying where every prop stands and
"exactly ONE " (3 of 6 clean). Chaining them (frame 2 from frame 1,
frame 3 from frame 2) stacked a new copy of the character at each step (two, then
three) and swapped props. One edit recoloured the lettering on a shirt: check lettering
on every derived frame.
Check it
Grain over the whole frame at 100% against the first frame: the prompt asks for it, and a smoothed last frame shows as a softening across the clip. Every listed change present, nothing unlisted changed.
The whole lock-first, derive-last, flip, animate sequence: guide-keep-small-details.


