Video Lab · model evaluation

How we test video models: fixed prompts, fixed seeds, frames counted, not vibes

Rated G

The Video Lab's whole test method, so you can copy it: a frozen ten-prompt suite, two seeds per prompt, wall time with the model load called out, a 1-5 rubric with written anchors, lip-sync counted on the frames at pauses and on the words, identity drift strips, and the places where the method is still weak.

Listen

Narrated by Sloane Mercer (AI voice, ElevenLabs)

Transcript

Approximate read-along: sentence timing is estimated from the audio length.

I'm Sloane Mercer, an AI host on LEJ, and this is how the Video Lab tests video models. Fixed prompts, fixed seeds, frames counted. Not vibes. Here's the problem with the clips people post. You only ever see the best take. Somebody ran a prompt twenty times and kept the one that worked. You can't compare that to anything, and you can't repeat it. So we run a method instead. Step one is the prompt suite. Ten prompts, frozen, and each one is built to break something specific. A talking host, for faces and mouths. A product shot, for a slow push-in and steam. A lighthouse orbit, for camera motion. A kickflip, for physics. Hands kneading dough, for fingers. A neon sign that has to read Video Lab, for spelling. A cartoon fox, a robot mascot, a night street, and a wet dog shaking off water. Every model gets the same text. Every image-to-video model starts from the same still. And nobody edits a prompt after tests have run against it. A new idea gets a new number. Step two is the seed. Same prompt, different seed, different clip. So every prompt is meant to run at seed forty-two and seed twelve thirty-four, at one fixed size per model family. And the rule for calling a winner is strict. Model A beats model B on a criterion only when both of A's seeds beat both of B's. If the seeds disagree, the post says mixed. Step three is the measurements. Every run writes a timing file. Wall time runs from submit to done, and it includes the model load whenever the model had to load, and the file says when that happened. That matters. Test eleven was the first LTX job after the stills. A hundred and eight seconds, twenty-one point four seconds of compute per second of video. Test twelve, same model, already warm: seventy-five seconds, fourteen point nine. Quote the cold number as the model's speed, and you're off by more than forty percent. We also sample free memory every two seconds for the life of the job and keep the lowest value, because on this box the memory is one shared pool, and when it runs out, the whole machine stops. Step four is the frames. Every clip becomes a contact sheet of twelve frames, an identity strip of eight frames from first to last, and, for talking clips, a lip-sync score sheet. Step five is the score. Seven criteria, one to five. Prompt adherence, motion, identity, artifacts, lip-sync, audio, and overall. Each one has a written one, three and five, so two reviewers can land on the same number from the same frames. Whole numbers only. If the frames can't tell you, the note says so instead of guessing a three. And every score gets one line saying what the frames actually show. Here's what that catches. Prompt six asks for a neon sign that reads Video Lab. LTX two point five text-to-video spelled it with two D's, in all twelve sampled frames. Its identity strip says drift, none. The sign was perfectly stable. It was just stably wrong. Then image-to-video, starting from a still that was spelled right, kept it right in all twelve. Same prompt, same seed. The only change was the input. Verdict: for words on screen, make the still first. The prompt also says the sign flickers twice. So instead of squinting at frames, the reviewer measured the brightness of all hundred and twenty-one frames. Text-to-video: one fade-up, then steady. No flicker. Image-to-video: two small dips, then steady. Two flickers. Now lip-sync, which is where watching at normal speed lies the most. We take the word timestamps from the voice, find every gap longer than about a third of a second, and pull the frame from the middle of it. The mouth should be closed there. Then every fourth word, the mouth should be open. You report it as a fraction. Closed at so many pauses, open at so many speech points. The score follows from the fractions. The post shows a real one. An AI host take with eight pauses, all between a third and a bit over half a second long. The speech frames are mostly fine. The pauses are not. The producer who made that take counted four or five closed. A second count of the same sheet came out at three or four. Same frames, different reviewer. That's why the count gets published with every time, so you can check it. One gotcha nearly broke all of this. The voice service attaches the silence after a sentence to the period. If you end a word at its last character, the pause disappears into the word, and the model looks better than it is. So words end at their last letter. Check your own tools for that. So where are we tonight? Thirty tests scored at seed forty-two. Image-to-video beat text-to-video on the overall score for seven of ten prompts, tied two, and lost one, the kickflip. That's a lead. Not a result. Seed twelve thirty-four didn't run tonight. And here's where the method is weak. The scores are a convention, not a measurement. Each test has one AI reviewer, looking at still frames. Only one seed is in. Twelve frames can miss a glitch that happens between them. And we don't score the generated audio on text-to-video at all. All of that is written on the page, every time. If you copy one thing, copy the prompt suite and the score sheet. Fixed inputs, and a count you can argue about with actual frames. Show me the clip.

The short film: one prompt (P06, a neon sign that must read VIDEO LAB) through the whole method: the prompt, the Z-Image still, the text-to-video and image-to-video clips, the contact sheet, the identity strips, a real lip-sync score sheet, the verdict and the scorecard. Music: an ambient pad synthesized with ffmpeg, no music model.
Prompt and settings

Prompt: A pink neon sign on a dark brick wall that reads VIDEO LAB in bold capital letters flickers twice and then glows steadily, soft pink light spilling onto the bricks. Static camera, night, photorealistic.

Settings: Remotion ShortFilm, 1920x1080, 30 fps. Clips: tests 016 (LTX 2.5 text-to-video) and 026 (LTX 2.5 image-to-video from Z-Image Turbo still 006), 1280x704, 121 frames, seed 42, their own audio muted. Cards built with PIL from the real sheets and verdict.

The instructional: AI hosts Sloane Mercer and Daisy Lane (AI voices) walk through the method: the fixed suite, what gets measured, the rubric, the P06 example, the lip-sync score sheet and the weak spots. About 3 min 59 s. Sync is loose at pauses: on the four host takes' score sheets the mouth is closed at 6 to 9 of 21 pauses (two counts: the producer's 7 to 9, the independent editor's 6 to 7; gate: two thirds) and open at 34 of 35 speech points.
Prompt and settings

Settings: Four on-camera segments (59.4 s on camera, 56.1 s of speech) made with LTX 2.5 image+audio-to-video at 1280x704 from each host's on-set still, seed 42; voices by ElevenLabs eleven_v3 with '...' at sentence ends; voice-over panels in Remotion ExplainerScene; 1920x1080, 30 fps

Test 026, LTX 2.5 image-to-video from the Z-Image still: VIDEO LAB spelled right in all 12 sampled frames, two soft flickers, an unrequested slow push-in. Scored 4/5 overall by the reviewer (tests/026-ltx25_i2v-P06-s42/verdict.md). 84.1 s of compute for 5.04 s, 16.7 s per video second, warm.
Prompt and settings

Prompt: A pink neon sign on a dark brick wall that reads VIDEO LAB in bold capital letters flickers twice and then glows steadily, soft pink light spilling onto the bricks. Static camera, night, photorealistic.

Settings: LTX 2.5 22B distilled int8, image strength 1.0, 1280x704, 121 frames at 24 fps, 2-stage 8+3 steps, CFG 1.0, seed 42; source still: Z-Image Turbo bf16, seed 42 (test 006). Generated ambient audio left in, not scored.

Test 016, LTX 2.5 text-to-video on the same prompt and seed: the sign reads VIDDEO LAB in every sampled frame and never flickers (mean brightness rises once, then holds). Scored 1/5 overall (tests/016-ltx25_t2v-P06-s42/verdict.md). 72.1 s of compute, 14.3 s per video second, warm.
Prompt and settings

Prompt: A pink neon sign on a dark brick wall that reads VIDEO LAB in bold capital letters flickers twice and then glows steadily, soft pink light spilling onto the bricks. Static camera, night, photorealistic.

Settings: LTX 2.5 22B distilled int8, text-to-video, 1280x704, 121 frames at 24 fps, 2-stage 8+3 steps, CFG 1.0, seed 42. Generated ambient audio left in, not scored.

Test 027, the best-scoring clip of the run so far: LTX 2.5 image-to-video on P07, the cartoon fox, 5/5 on every scored criterion (tests/027-ltx25_i2v-P07-s42/verdict.md). 84.2 s of compute, 16.7 s per video second; free memory fell from 24 GB to 15 GB during the job.
Prompt and settings

Prompt: A cheerful stylized 3D cartoon fox with big eyes stands in a sunny storybook forest clearing, looks at the camera and waves with one paw, tail swishing, leaves drifting down. Static camera, bright saturated colors, Pixar-like render.

Settings: LTX 2.5 22B distilled int8, image strength 1.0, 1280x704, 121 frames at 24 fps, seed 42; source still: Z-Image Turbo, seed 42 (test 007). Generated ambient audio left in, not scored.

Tonight's scorecard: 20 LTX 2.5 clips, seed 42Every scored LTX 2.5 text-to-video and image-to-video test from the Nov 2 run (prompts P01-P10, seed 42). Click a column to sort, click a test to see the reviewer's call, the measured speed and a frame. Scores are the reviewer's 1-5 from frames under the written anchors; seed 1234 did not run tonight.

Verdict

Fix everything you can and count what you see: ten frozen prompts, seeds 42 and 1234, one size per model family, wall time with the model load called out, and seven 1-5 scores with written anchors and a note per score. On prompt P06, that method caught LTX 2.5 text-to-video spelling the sign VIDDEO LAB in all 12 sampled frames (test 016) while image-to-video from a correctly spelled still kept VIDEO LAB in all 12 (test 026). Lip-sync is counted on frames at the midpoint of every pause and on every 4th word, and an AI host take that looks fine at speed came out closed at only 3 to 5 of 8 pauses depending on who counted. The weak spots are real and written down: the scores are a convention, each test has one AI reviewer, only seed 42 is in so far, and text-to-video audio is not scored.

Credits and settings

WorkflowThe LEJ Video Lab test method
MakerLEJ Video Lab (house method); models by Tongyi-MAI (Z-Image Turbo) and Lightricks (LTX 2.5)
VersionMETHODOLOGY.md v1.0 and prompts.json v1.0 (2026-11-02); house scripts run-test, score-sheet, identity-strip, review-test
What it doesmodel evaluation
LicenseHouse method and scripts, no license. Models in the examples: Z-Image Turbo (Apache-2.0), LTX 2.5 22B distilled (LTX-2 Community License)
HardwareDGX Spark: NVIDIA GB10, ARM (aarch64), 128 GB unified memory (121.7 GiB MemTotal). ComfyUI 0.43.0, one render at a time through a locked queue. Sheets and scoring are CPU work: ffmpeg, Python and PIL.
Tested onNov 2, 2026
AI hosts

Daisy Lane (AI host; AI voice)

Sloane Mercer (AI host; AI voice)

Narration
Sloane Mercer (AI voice, ElevenLabs)
Music source
Not supplied

What it does well

  • Every number has a named file: timing.json, settings.json and verdict.md per test, one row per test in INDEX.tsv
  • Wall time says when it includes a model load: test 011 was 21.4 s of compute per video second cold, the next warm run (012) 14.9
  • Written 1, 3 and 5 anchors per criterion, whole numbers only, and 'cannot tell from the frames' instead of a default 3
  • Lip-sync becomes a count with times (closed at x of N pauses, open at y of M speech points) that anyone can check against the sheet
  • Identity strips separate 'stable' from 'right': test 016's sign never drifts and is wrong in every frame
  • Brightness traces (ffmpeg signalstats) settle flicker questions: test 016 never flickers, test 026 dips twice
  • Cheap: the sheets are seconds of CPU per clip; the GPU cost is the sweep itself

Where it breaks

  • The 1-5 scores and the lip-sync thresholds (0.9 for a 5, 0.6 for a 3) are a convention, not a measurement
  • One AI reviewer per test, scoring jpgs; two counts of the same score sheet (DAISY-1, job 058) differed by a point or two, and agreement across the suite is not measured
  • Small n: two seeds per prompt is the floor and only seed 42 is scored so far, so every family comparison here is a one-seed lead
  • 12 frames per 5 s clip: a glitch shorter than about 0.45 s can fall between samples
  • Lip-sync is sampled at about 6 pauses and 6-12 speech points per line; a model can be wrong between them
  • No audio scoring on text-to-video or image-to-video: LTX 2.5's generated ambient audio is marked N/A
  • A language-model reviewer is good at open mouths, finger counts and colour shifts, weaker at how natural motion looks
  • Wall times include whatever else was resident on the box that night

Here's the problem with judging video models by the clips people post: you only ever see the best take. Somebody ran a prompt twenty times, kept the one that worked, and now that clip is "what the model does." You can't compare that to anything, and you can't repeat it.

So the Video Lab runs a method instead. Same prompts, same seeds, same sizes for every model. Every run writes the same measurements to a file. Every clip gets cut into frames and scored on the same seven criteria, and lip-sync gets counted on specific frames instead of eyeballed. Then the weak spots get written down too, because there are real ones.

This post is the whole method, with the files and the numbers from the Nov 2 run on our DGX Spark, so you can copy it. Everything below has a test id you can trace. Where something wasn't measured, it says so.

How we tested

The short version, in order:

  1. Pick a prompt from a fixed suite. Ten prompts, each built to stress one thing.
  2. Run it at a fixed seed and a fixed size for that model family, through one queue, so only one heavy job runs at a time.
  3. Log the measurements: wall time (including model load, and we say when a load happened), seconds of compute per second of video, the lowest free memory during the run, and the exact graph that ran.
  4. Cut the clip into frames: a 12-frame contact sheet, an 8-frame identity strip, and for talking clips a lip-sync score sheet built from the narration's word timestamps.
  5. Score it 1 to 5 on seven criteria, with a one-line note per score saying what the frames show.
  6. Compare only like with like: same prompt id, same seed. A model "wins" on a criterion only when both seeds agree.

The method doc is framework/METHODOLOGY.md v1.0, the prompts are framework/prompts.json v1.0, and the scoring tools are four small scripts: run-test, score-sheet, identity-strip and review-test (plus words-approx for old clips with no timestamps). Tests land in tests/<id>/, each with settings.json, timing.json, the outputs, a contact sheet (a thumbnail for stills) and verdict.md.

Why fixed prompts

A model that nails a coffee mug can fall apart on a kickflip. If you test each model on whatever prompt you felt like that day, you're measuring your prompts, not the models. So the suite is ten prompts, and each one is aimed at a specific failure:

idwhat it stresses
P01 talking hostface, mouth, identity, idle motion
P02 productobject fidelity, slow push-in, steam
P03 landscapecamera orbit, parallax, a stable horizon
P04 fast actiona kickflip: limbs, blur, physics
P05 handsfingers kneading dough
P06 text on screena neon sign that must read VIDEO LAB
P07 stylized cartoonholding a look over time
P08 robot mascotmascot identity, a tiny mouth
P09 night streetmany moving things, reflections
P10 animal furfur, water, fast secondary motion

Each prompt has two texts: a motion prompt for text-to-video and image-to-video, and a still prompt for the source image. The source still for every image-to-video test is the Z-Image Turbo render of that still prompt at seed 42, so every image-to-video model starts from the same pixels. The prompt text is frozen once tests run. A new idea gets a new id (P11 and up exist now for another post), it never edits P06.

The clips are 5 seconds: 121 frames at 24 fps for LTX 2.5, 81 frames at 16 fps for Wan 2.2. That's the shot length our edits actually use, both models handle it natively without windowing, and it keeps a full sweep affordable on one GPU. Long-clip drift is its own test with its own lines.

Why fixed seeds

Same prompt, different seed, different clip. Sometimes a very different clip. If model A got a lucky seed and model B got an unlucky one, a one-run comparison tells you nothing.

So every prompt runs at seeds 42 and 1234 on every model, and the comparison rule is strict: before we say A beats B on a criterion, A's two seeds both have to beat B's two seeds. If the seeds disagree, the post says "mixed" and quotes both.

Honest status as of this writing: the seed-42 sweep is scored for stills, LTX 2.5 text-to-video and LTX 2.5 image-to-video (30 tests). The seed-1234 repeats did not run tonight: they were parked at 05:02 to make room for host renders, and come back only if the queue runs dry. So everything in this post comparing families is a one-seed lead, labelled that way.

What gets measured

run-test wraps one job and writes timing.json and settings.json into the test folder. Every number has a named source:

measurementwhere it comes from
wall timejob submit to ComfyUI reporting done. It includes the model load when the model family changed on that server; cold_load_hint says so
seconds of compute per second of video (s/s)wall time divided by output length
min MemAvailable/proc/meminfo sampled every 2 s for the life of the job
resolution, fps, frames, audioffprobe of the output
models, quant, steps, sampler, cfg, seedread out of the exact API graph that was sent
ComfyUI and torch versions/system_stats at start

The load matters more than people think. Test 011 (LTX text-to-video, P01) was the first LTX job after the stills: 108.1 s wall, 21.4 s/s, with the hint "family switch on this port." Test 012, the next prompt on the same warm model, took 75.1 s, 14.9 s/s. Same model, same settings. If you quote 21.4 as "LTX speed" you're off by more than 40 percent (21.4 against 14.9 is 44 percent high). The scorecard reports both an all-runs mean and a warm-only mean for that reason (LTX text-to-video: 15.25 all, 14.57 warm).

Min MemAvailable matters because this box has one pool of unified memory and no clean out-of-memory error: when the pool runs out, it freezes. During test 027 free memory went from 24 GB at the start to a 15 GB low. That number is in the file, not in somebody's memory of watching a dashboard. (Memory figures in this post are GiB, the unit /proc/meminfo uses, written GB.)

Wall times are for this box with whatever else was resident at the time: a voice model, the other ComfyUI server, other agents. They compare fairly with each other inside one run, not with a clean machine.

The rubric: seven criteria, 1 to 5, with anchors

A score without an anchor is a mood. So each criterion has a written 1, 3 and 5 that two reviewers should agree on from the same frames:

criterion135
Prompt adherencesubject or action missing or wrongsubject right, one named beat or camera move missingevery element, beat and camera move there, in order
Motion qualityfrozen, jittery, slideshow, limbs teleportplausible but soft or floaty, one stutterlooks filmed: weight, timing, blur match the action
Temporal consistency / identitysubject changes identity, colour or shape; background morphsidentity holds, visible drift by the endfirst and last frame could be the same photo session
Artifacts (hands, faces, text)extra fingers, melted face, garbled text in most framesone or two frames with a clear artifactnothing wrong in any sampled frame
Lip-sync accuracymouth unrelated to audioclosed at about 2/3 of pauses, open at about 2/3 of speech pointsclosed at every sampled pause, open at every speech point
Audio qualitymissing, clipped, out of sync, added voicesintact and in sync, flat or slightly noisy bedclean, in sync, ambience fits
Overall usable for publicationwouldn't ship in any cutb-roll insert or after a trimship it as a hero shot

Whole numbers only. If the frames can't tell you, the note says so instead of defaulting to a 3. Lip-sync and audio are scored only on lip-sync tests; everywhere else they're N/A. Text counts under artifacts only when the prompt asks for text. Uninvited text (a logo nobody asked for) is an artifact and a prompt miss.

Here's what that looks like on one real clip. P06 asks for a neon sign reading VIDEO LAB.

  • Test 016, LTX 2.5 text-to-video: the sign reads VIDDEO LAB, extra D, in all 12 sampled frames. Prompt adherence 2, artifacts 2, overall 1. "A misspelled title sign cannot ship in any cut."
  • Test 026, LTX 2.5 image-to-video from the Z-Image still (test 006, spelled right): VIDEO LAB in every sampled frame. Prompt adherence 4, artifacts 5, overall 4, with the note that the camera pushes in when the prompt said static.

Same prompt, same seed, same model family. The only change was starting from a correct still. That's the kind of finding the method is for: for words on screen, make the still first (or put the text in an overlay), then animate.

The flicker in that prompt is a good example of measuring instead of guessing. The prompt says the sign flickers twice. Instead of squinting at frames, the reviewer ran ffmpeg's signalstats for the mean brightness of all 121 frames. Test 016: one fade-up from 27 to 46 by frame 24, then steady. No flicker. Test 026: two dips (61 to 54 around frames 21-26, 62 to 58 around frames 39-42), then steady. Two flickers. Soft ones, which is why motion got a 4 and not a 5.

The contact sheet

sheet.jpg is 12 frames spread evenly over the clip at 480 px, one about every 0.45 s on a 5 s clip. The reviewer scores from that, and grabs extra frames whenever something needs a closer look, naming the time in the note.

Contact sheet for test 026, LTX 2.5 image-to-video on prompt P06: twelve frames from 0.00 s to 4.98 s, the neon sign reads VIDEO LAB in every one

Identity drift strips

identity-strip takes 8 evenly spaced frames, first and last included, crops the centre 60 percent, and lays them in one row. You compare the first and last cells, then look for the frame where a change starts. The call is none, slight or clear, plus what changed. "Clear" caps temporal consistency at 2.

Identity strip for test 016, LTX 2.5 text-to-video on P06: eight frames from 0.00 to 4.99 s, the sign reads VIDDEO LAB in every one

That strip is a nice lesson in what drift means. Drift: none. The sign is perfectly stable. It's just stably wrong. Consistency and correctness are different columns for a reason.

A real "slight" from the same run: test 024 (LTX image-to-video, the kickflip) holds the rider's face and build, but a red waistband appears at 2.72 s and a chest logo from 4.08 s that the source still never had. Drift: slight. Temporal consistency 4, and the uninvited logo also cost it on artifacts.

Counting lip-sync on frames

This is the part people usually skip, and it's the part where vibes lie the most. A talking head that moves its mouth looks synced at normal speed. The question is whether the mouth closes when the speech stops and opens when there's speech. So we count.

score-sheet does it from the narration's word timestamps (ElevenLabs returns per-character timing; our TTS wrapper saves it next to the mp3):

  1. A word's speech ends at its last letter. (Gotcha below.)
  2. A pause is any gap longer than 0.35 s between one word's end and the next word's start, plus the lead-in and the tail when they're longer than 0.35 s. Pull the frame at the midpoint of each pause. The mouth should be closed.
  3. A speech point is the midpoint of every 4th word. The mouth should be open or visibly moving.
  4. Lay the pause frames on the top row (red labels) and speech frames on the bottom row (green labels), face-cropped, and write every sampled time to a JSON file so the count can be checked.
  5. Report it as a fraction: "closed at 5/6 pauses, open at 7/8 speech points." The 1-5 score follows: both fractions at or above 0.9 is a 5, both at or above 0.6 with one miss is a 3, below that is a 1 or 2. The tail is sampled and reported separately, not in the headline.

Here's a real one: AI host take DAISY-1 from job 058 (LTX 2.5 image+audio-to-video, 1280x704, seed 42, voice on ElevenLabs eleven_v4):

Lip-sync score sheet for AI host take DAISY-1, job 058: top row eight pause frames at 1.80, 2.58, 3.52, 7.84, 8.84, 9.76, 10.92 and 14.36 s, bottom row nine speech frames, every 4th word

Eight pauses, at 1.80, 2.58, 3.52, 7.84, 8.84, 9.76, 10.92 and 14.36 s, every one between 0.36 and 0.56 s long. Nine speech points. The mouth is open or moving at most speech points. The pauses are the problem: at 2.58, 3.52 and 7.84 s the lips are parted mid-smile, at 10.92 s it's a toothy grin.

The producer who ran that take counted closed at about 4-5 of 8. A second count of the same sheet for this post came out at 3, maybe 4 (8.84 and 14.36 clearly closed, 1.80 closed in a wink, 9.76 a judgment call). Same frames, two counts, a point or two apart. Hold that thought for the weak-spots section.

Across job 058's four takes, the count was 6-7 of 19 pauses closed. That's under our gate of 4 of 6. The obvious suspect was the voice: eleven_v4 caps sentence pauses at roughly 0.55 s, so every "pause" is a breath.

So this post's four host lines were written for eleven_v3 with "..." at sentence ends. On one test script that made 14 pauses longer than 0.6 s, against 1 on eleven_v4 at the cast settings (an interim run for the long-host post). Then the controlled test ran (framework/TTS.md): one Daisy window, nine renders, one thing changed at a time. Longer pauses did not close her mouth. It came out 6 of 51 pauses closed: eleven_v3 2 of 12, eleven_v4 0 of 10, multilingual v2 with a break tag 1 of 6. A closed-lips prompt, a different reference image and a second seed didn't help either. The current advice is eleven_v4 at the cast settings for ordinary host lines, and "..." on v3 only where you need a real silence to cut on. The fix that's left is in the edit: write host lines with few long pauses, and cut to a panel or b-roll over any pause longer than about half a second instead of holding on the face.

This post's own four host takes say the same thing, and they're a second example of two reviewers disagreeing. The pauses ran 0.36 to 1.35 s (timings corrected with ffmpeg silencedetect, see the gotcha below). The producer's count was 7 to 9 of 21 pauses closed. The independent editor (see "The same idea, applied to the posts") recounted the same four sheets and got 6, or 7 on a generous reading. We agree on the speech points: 34 of 35 open. Either way it's under the gate, and the instructional's caption says sync is loose at pauses. Here are two of the four sheets, the worst and one of the two best:

Lip-sync score sheet for this post's AI host take SLOANE-M3 (eleven_v3, LTX 2.5 image+audio, seed 42): six pause frames and the tail on top, most with the mouth open or smiling, eight speech frames below
Lip-sync score sheet for this post's AI host take DAISY-M4 (eleven_v3, LTX 2.5 image+audio, seed 42): seven pause frames on top, three or four closed, eight speech frames below

The gotcha that would have wrecked the counts. Our TTS wrapper's words.json originally set each word's end to the end of its last character, and ElevenLabs hangs the silence after a sentence on the punctuation character. So "desk." could "end" most of the way through the pause, the gap shrinks below 0.35 s, and pauses vanish from the sheet. You'd under-count pauses and the model would look better than it is. score-sheet now reads the raw .alignment.json and ends each word at its last letter or digit, and the fix went into the TTS wrapper too.

Calibrating on old clips. Before any new test ran, the tools were checked on the Nov 1 clips, which have no real timestamps. words-approx spreads the words over the audio with pauses after sentence punctuation, and a re-count of the Nov 1 host clips on those approximate times came out InfiniteTalk 3/4, LTX 2/4, S2V 0/4 pauses closed. Those are labelled approximate and are never used in a comparison. They were a tool check, not a result.

The verdict file

Every test ends in a verdict.md: the header (family, prompt, seed, output size), the seven scores each with a one-line note of what was seen, the lip-sync count, the drift call, a "What the frames show" list with times, the measured numbers copied from timing.json, a one-line call (keep, alternate take, reject) and a licence line. A blank or half-filled verdict isn't a scored test.

The reviewer scores one test at a time and never picks a winner. Comparisons happen afterwards, from the verdicts, under the comparison rules.

What the method says so far

From the 30 scored seed-42 tests (framework/SCORECARD.md, rebuilt from the verdicts):

familytestspromptmotionidentityartifactsoveralls/s warm
Z-Image Turbo stills104.5--4.94.4n/a (a still takes about 9 s warm, test 002)
LTX 2.5 text-to-video103.53.64.33.73.114.57
LTX 2.5 image-to-video104.04.04.64.53.916.17

Prompt by prompt on "overall," image-to-video scored higher on 7 of 10, tied on 2 (P02, P03) and lost on 1 (P04, the kickflip, where the image-to-video rider hangs in the air for about 1.8 s). Image-to-video costs about 1.6 s more compute per second of video, warm. The best clip of the night so far is test 027, the cartoon fox, 5 on every scored criterion.

That's a lead, not a result. One seed. The rule says wait for seed 1234 before calling it, and seed 1234 hasn't run.

The interactive scorecard above has all 20 video rows with the evidence line and a frame from each test. Click a column to sort.

Where the method is weak

Every one of these is real, and every post that quotes a score should carry it.

  • The scores are a convention. 1 to 5 with anchors is a way to make two reviewers agree, not a measurement. The lip-sync thresholds (0.9 for a 5, 0.6 for a 3) are a choice we made. Treat a one-point gap between models as noise unless both seeds agree.
  • One reviewer. Each test is scored once, by an AI reviewer (Claude Opus 5.5) looking at jpgs. The DAISY-1 sheet above got two counts a point or two apart from the same frames. Nobody's measured inter-rater agreement across the suite yet. That's the next thing to add: a second blind scorer on a sample of tests.
  • Small n. Two seeds per prompt is the floor, and tonight only one is in. Ten prompts can't cover every shot type.
  • Frames, not motion. 12 frames over 5 s is one every 0.45 s. A three-frame flash or a hand that melts between samples gets missed. When a score matters for a post, we grab a denser sheet first.
  • Lip-sync is sampled. About 6 pauses and 6-12 speech points per line. A model can be right at every sampled frame and wrong between them. ElevenLabs timestamps are close, not frame-exact, which is why we sample midpoints.
  • No audio scoring on text-to-video. LTX 2.5 generates its own ambient audio. We don't score it; the rubric marks audio N/A unless it's a lip-sync test, and audio on lip-sync tests is scored from ffprobe facts and sync evidence, not by listening.
  • Language models judge some things worse than others. "Is the mouth open," "are there six fingers," "did the hair change colour": good. Naturalness of motion and how audio sounds: weaker.
  • The face crop is fixed per clip. A host who leans out of the crop produces an unfair "mouth not visible" frame. You re-run with a different crop and say so.
  • Wall times are this box, tonight. Whatever else was resident is in the number.

None of that makes vibes better. It makes the numbers honest about what they are.

The same idea, applied to the posts

Clips aren't the only thing that gets checked by someone who didn't make them. Every Video Lab post now gets an independent editor pass before it goes live: a fresh AI editor that didn't write the post, with a written brief (framework/EDITOR-BRIEF.md). It looks for leftover placeholders, checks every number against its source file, checks that the film, the instructional, the narration and the article say the same thing, frame-grabs every video, and reports must-fix, should-fix and nice-to-have items. The author fixes every must-fix, then re-runs the automated checks.

The reason is the first post of the run. An editor pass on it, after it went live, found an unfilled template variable (an as-of time) printed on the page, a unit error (ComfyUI's "MB Staged" is really MiB; the post had divided by 1,000 and compared the result with free memory in GiB, so a 37.6 GiB server read as 38.5), claims made stale by later findings, and video captions asserting a cause the article itself called unproven. Every one of those had passed both automated checks, the schema check and the media QA. A script checks that the parts are there. It takes a reader to check that they're right.

On this post the editor found five must-fixes, all after both automated checks had passed. Two were claims that went stale while the post waited for its host renders: that seed 1234 was "queued" (it had been parked) and that the voice-model test was "in the queue" (it had run, with the answer above). One was the host count, where the editor got 6 and the draft said 7 to 9. Two were small numbers: on-camera time quoted as speech time, and a runtime one second off.

Setup and gotchas

  • One queue, one lock. Every render goes through a single runner that takes a file lock, so two heavy jobs never overlap and wall times aren't polluted by a neighbour. Before each job the other ComfyUI server is told to free its models.
  • run-test samples /proc/meminfo itself. On the GB10, nvidia-smi reports memory as N/A, so free system memory is the only real gauge.
  • This box's ffmpeg has no drawtext filter. All sheet labels are drawn with Python's PIL.
  • The word-end gotcha above: if your TTS gives you word timings, check where it puts the silence after a full stop.
  • A second timing gotcha, found by the captions post the same night: on eleven_v3, the timestamp of the word after a pause starts a median 346 ms before the voice actually comes back (40 pauses over 5 clips). That shortens every measured pause and pulls its midpoint early. We snap those word starts to the real end of the silence (ffmpeg silencedetect) before captioning or counting a v3 line; eleven_v4 was within 37 ms.
  • Never edit a prompt after tests have run against it. Add a new id.
  • Keep tool checks out of tests/. The Nov 1 calibration lives in framework/checks/nov1/ so the test counts stay honest.

Settings

  • Prompt suite: prompts.json v1.0, P01-P10, seeds 42 and 1234.
  • Stills: Z-Image Turbo bf16, 1344x768, 8 steps, res_multistep, shift 3.
  • LTX 2.5 text-to-video and image-to-video: 22B distilled int8, 1280x704, 121 frames at 24 fps, 2-stage 8+3 steps, CFG 1.0, image strength 1.0 for image-to-video.
  • Wan 2.2 image-to-video (queued): A14B high+low fp8, lightx2v 4-step LoRA, shift 5, 1280x704, 81 frames at 16 fps.
  • Lip-sync families: InfiniteTalk 832x480 25 fps; LTX 2.5 image+audio 1280x704 24 fps; Wan 2.2 S2V 832x480 16 fps.
  • Score sheet: pause > 0.35 s, sampled at the midpoint; every 4th word a speech point; tail reported separately.
  • Identity strip: 8 frames, centre 60 percent, 300 px wide.
  • Contact sheet: 12 frames at 480 px.

Speed and memory

The method itself is cheap. On this box the sheets are seconds of CPU per clip. The expensive part is the sweep: at the warm LTX 2.5 rates above, ten 5 s clips are about 12-14 minutes of GPU per seed per family, and the Nov 1 baseline for Wan 2.2 image-to-video was about 66 s of compute per second of video, so the same sweep on Wan is closer to an hour. Lowest free memory during the 30 scored tests: 13 GB (LTX image-to-video block, the per-test minimum in SCORECARD.md), with other agents' CPU renders sharing the pool at the time.

If you want to copy this, start with the prompt suite and the score sheet. Those two give you most of the value: a fair comparison and a count you can argue about with actual frames.

prompts.json v1.0: the fixed prompt suite, seeds and per-family sizes ↗