We extended a 30 second AI video clip to 62 seconds, with every original frame kept and no join you can see. It took 57 renders and 79 minutes of GPU time on one workstation. Numonic could read the full record of every raw render. It could not read the finished cut.
The clip is a third-person platform game scene generated with LTX-2.5: a hero running across floating islands, with game music. The goal sounds simple. Keep going for another 30 seconds, keep the characters and the level recognisable, and keep the music playing across the join. In practice the first attempt failed in a way we did not catch, and the check we trusted missed it.
Why Did the First Extension Fail?
We generated the new 30 seconds in one pass, joined it to the original, and checked a contact sheet of sampled frames. They looked fine: same island, same character, same light. A person watching the clip at speed saw what the sheet could not. At the join the hero stopped and the camera snapped to a different angle.
Measured properly, the average change from one frame to the next was about 7.2 before the join and 0.7 after it, with a spike at the join itself. The footage was plausible and almost frozen. Sampled frames cannot show that. A number can.
The cause was ours. The prompt described a camera behind the hero, running away. The last frames of the original showed a diagonal side view of a rope swing. At the first frame the model was free to choose, it followed the prompt instead of the footage.
What Fixed the Joins?
Four changes, each of which we tested on its own before keeping it:
- Describe what the last frames show. Camera angle, direction of travel and pose go in the prompt, with negatives against stopping and camera snaps.
- Condition on four seconds, not two. A longer overlap of real frames gave the model momentum to continue from.
- Crossfade the overlap. The regenerated overlap differs slightly in tone from the original, so switching at a hard edge pops. We keep the regenerated frames and fade from the original into them, where both show the same moment.
- Choose the join point. This mattered most. The same seam failed on 17 of 18 attempts across seeds, prompts and settings. Backing the join up to an earlier, better framed moment passed four times out of four, because the model snaps away from a context where the subject is tiny, far away or nearly still.
How each ten second segment was made
How Do You Score a Seam?
We used three checks, all computed from the finished frames. Motion before and after the join, as the average frame-to-frame change. The size of the spike across the join compared with the surrounding motion. And whether the reference image used to keep the characters consistent has leaked into the output, which we detect by correlating frames with that image.
The leak is real. It showed up in one 30 second single pass, where the reference sheet filled about eight seconds of the clip, and in a test where we weakened the reference. It never fired on the short segments we kept. The final four seams sit between 1.0 and 1.2 times the motion around them, and the music matches across each join at 0.95 to 0.997 on pitch-class similarity.
These are heuristics, not proof. We still watched every seam. The score is there to stop us trusting a contact sheet.
What Did Numonic Know About the Result?
We uploaded the pieces: the original clip, the reference sheet, the 45 second stage, the raw segments, and the 62 second cut. Then we asked Numonic what it knew about each.
For a raw segment, quite a lot. Numonic read the embedded ComfyUI graph of 38 nodes, the positive and negative prompts, all five models including the reference LoRA, the seed, and the name of the input video the segment continued from. It marked that lineage as extracted from the file, not asserted by the uploader. That is what lineage should look like.
For the 62 second cut, almost nothing. The file was assembled with ffmpeg, so it carries no graph. It arrived with no workflow, no prompt, no parents, and lineage marked as asserted by the uploader. Its AI description read like a concept art board with character sheets. The likely reason is that the first second of the original clip is the character sheet itself, so a description built from the opening frame describes the sheet.
The raw renders carried the record. The cut we actually share carried none of it.
How Do You Keep the Record When You Assemble a Video?
Until assembled files can point back to their parts, the practical answer is to keep the parts. Put the raw renders in the same collection as the cut, name them so the order is obvious, and keep the final next to the pieces that made it. The raw renders carry the prompts, models and seeds. The cut only needs to say which renders it came from.
The same applies to the rejected takes. Of 57 renders, four segments made it into the cut. Without a record of which was which, and why the rest were set aside, the next person to extend this clip starts again. This is the same problem as provenance across tool boundaries, and it is one we are tracking for assembled video.
Key Takeaways
- Sampled frames can look fine while a character has stopped moving. Measure motion before and after every join.
- Describe what the last frames show, overlap four seconds, and crossfade the regenerated overlap.
- The join point decides more than the seed or the prompt. Back up to a context with clear, steady motion.
- Numonic reads full lineage from raw ComfyUI renders, but an assembled cut arrives without it.
- Keep the raw renders beside the cut. They are the record.
