The Ntinda ladder: ten community workflows, re-set in Kampala, one measured technique each
Ten MiniMax H3 community workflows recreated one rung at a time on a 4090 and a 3090, each Africanized and each required to teach one technique: a street from OpenStreetMap as the motion reference, a De-Rope pass that looked identical and measured 18% softer, six action plates and a wooden paddle, crane and whip pans proven by numbers, and a two-voice Rolex-stand dialogue transcribed back.

The previous post ended with a formulation: locations as first-class assets, action beats as one generation, a gate that judges the film. This one is the training montage. Ten community workflows, recreated one rung at a time on two consumer GPUs, each one re-set in Kampala and each one required to teach exactly one new technique — measured, not admired. The subject is a girl skating the length of Ntinda Kigowa Road, drawn from my own reference sheet, on a street whose geometry came out of OpenStreetMap and whose look came out of a photo I took on the walk. All ten have rendered as of this update, most of them more than once; the post grows as the retries land.
Every number carries its artifact and config. Render receipts are JSON in the repo (docs/horde-knowledge/evals/h3-renders/); masters, specs and review strips are archived on the fleet store under animation/ladder/rung<N>/. Prompts are quoted verbatim. Hardware: an RTX 4090 and an RTX 3090 on the same host, MiniMax H3 int8_convrot checkpoints, 8-step turbo LoRAs unless stated.
The ladder
| # | Source workflow | Africanized as | Technique | State |
|---|---|---|---|---|
| 1 | Fake speedpaint timelapse (r/sd, three chained parts) | A Black artist draws a Black woman; one lo-fi groove under all three parts | native caption schema, monotonic-state law, xfade seams | done |
| 2 | Multishot anime skater | Ntinda Kigowa Road, my own cast sheet, photo-derived plate | multishot in one generation; OSM→GLB dolly as the motion reference | done, A/B'd |
| 3 | Time-period shift (pastebin) | Kampala living room → 1962, independence week, black and white | in-shot timed transformation | done |
| 4 | De-Rope second pass (MAINodes) | the skate-through, de-smeared | JerkOracle → TimeSmear → V2V inject → ExactRecover | negative on the dolly, positive on the ollie |
| 5 | H3 video-edit retention schema | real skate footage → our girl | character replacement over reference motion | done ×2 — a boundary, not a win |
| 6 | Latent-space 3D upscaler | the skate-through at 2× | upscale without a VAE round-trip | done, measured |
| 7 | Character action plates | one girl × six actions as modular coverage | coverage sheet as a reference | done |
| 8 | Previz camera choreography | crane and whip-pan through the real street | camera grammar from a block-out | crane and whip done |
| 9 | Timed VFX beat | a Kampala afternoon storm arriving mid-shot | sub-second beats in detailed_description | done, measured |
| 10 | Dialogue scene | Ugandan English at the Rolex stand, shot/reverse-shot | <d> tags, two voices, one generation | done ×2, transcribed |
Rung 2 — the street is a file, not a vibe
The skater workflow is three shots in one 124-frame generation: a wide down the street, a low tracking shot at board height, a static wide as she passes out of frame. The Africanization is not the costume. It is that the street under every shot is Ntinda Kigowa Road — 57 OSM nodes of it — pushed through a stdlib converter into a GLB, blocked out in Blender at eye height, and stylized into one cel plate that every shot addresses as <Picture 2>. The same Blender scene renders a 22-metre dolly that goes into H3's ref_videos socket, which is the model's only motion-control input.
Rung 2, ref_video arm — seed 7400, 512×896×124, r2v + turbo4-r2v, 628.8 s on the 4090.

Same seed, one variable. Top: with the dolly as ref_videos. Bottom: without. The dolly buys camera grammar — the wide actually travels.
The polish A/B was a no-op worth recording: adding named Luganda signboards to the prompt changed nothing, because on a plate-anchored shot the reference wins over prose for background detail. Lettering has to be baked into the plate. That is a rule now, not a hunch — and here is the plate with it baked in, a Qwen-Image edit of v2 at denoise 0.45:

v2 → v3. Same pole, awnings, tarmac and light; the shopfronts now carry KIGOWA PHARMACY, DUKA, telecom boards and a chapati stall. Two of six boards legible as words — at this strength the model draws signage convincingly and garbles anything longer than two words.

The closing measurement: seed 7400, one variable. Against plate v2 the shopfronts are blank yellow; against plate v3 the pharmacy board, the DUKA kiosk and the telecom boards are in every shot. The video reads the plate.
Rung 3 — a transformation the model would not do until it was anchored twice
rung3-kampala-timeshift-1962 — 768×576×243, fl2v + turbo8, 41 s/step.

Two women in a present-day Kampala living room; a wand pass; the room becomes October 1962 — gomesi, sash and headscarf, a radiogram, the new flag — and the picture goes black and white. Verbatim, the fade never took. It took when the era was anchored with two concrete looks ("1962 black and white" and "1960s newsreel look"). A colour-grade instruction needs a named visual referent, not an adjective.
Rung 4 — the strip lied and the numbers did not
De-Rope is a community second pass: an oracle flags the fastest events, a time-smear covers them, the clip is re-encoded and re-denoised from a schedule that injects at 70%, and an exact-recover step is supposed to hold every unflagged frame byte-for-byte. Wired into our renderer as derope: true and run on the rung-2 ref_video arm at the same seed.

Frame at 2.2 s. Left: first pass. Right: after De-Rope. Identical to the eye.
frames compared 124 mean |diff| per frame 22.9 / 255 (every frame > 1.0) frames held by ExactRecover (<0.2) 0 Laplacian sharpness, first -> derope 1033 -> 845 (-18%) f0-40 wide 1210 -> 976 f40-82 tracking 628 -> 531 f82-124 static wide 1271 -> 1036 cost of the pass ~505 s on top of a 629 s first pass
My first reading of that table was wrong, and the correction is the lesson. I assumed ExactRecover holds unflagged frames byte-for-byte, so "zero frames held" looked like a malfunction. The node docstrings say otherwise: TimeSmear retimes the clip onto a longer grid by repeating frames in the fast spans, the v2v pass re-draws that slowed-down video, and ExactRecover keeps the first frame of every hold group — it recovers the frame count, not the pixels. Every output frame is second-pass by design. The right metric is jerk in the fast spans, which is what the oracle itself measures. Three same-seed arms:
arm sharpness motion mean/p95 jerk mean/p95 tracking-section energy first pass 1033 12.09 / 25.86 2.41 / 3.29 18.64 De-Rope inject 0.7 q 0.75 12 steps 845 -18% 12.67 / 29.71 2.25 / 3.93 21.33 De-Rope inject 0.35 q 0.9 8 steps 763 -26% 11.47 / 25.57 2.62 / 5.17 17.94
Neither arm lowers jerk; both worsen the p95 spikes and cost sharpness. The reason is upstream: the previz dolly already stabilises the camera, so there is no burst for the oracle to fix. A stabilising mechanism needs an unstable input to prove itself — the fair test is the 56-frame ollie plate from rung 7, where the airborne frames are a real burst, and that run is queued as 4c. Read the node docstrings before you choose the metric.
4c came back, and it is the positive result the mechanism promises:
ollie plate, 56 frames, static camera, seed 7502 first pass De-Rope sharpness (Laplacian var) 337 339 (+0.6%) motion mean / p95 / max 10.6 / 30.3 / 35.9 13.1 / 26.0 / 29.9 jerk mean / p95 / max 9.12 / 26.5 / 34.7 1.65 / 4.57 / 6.25

Jerk down 82% on the mean and 83% on the p95, sharpness unchanged: the burst is drawn as an arc instead of a snap. Rule: De-Rope goes on a real burst under a static camera, never on a ref-video-driven move.
Rung 5 — replace the character, keep the motion, and watch what else you kept

Top: the source clip (a Japanese-alley anime skater with a Walkman). Bottom: H3 video-edit output, seed 7600, 1344×768×124, 1555 s on the 4090 — 35 minutes of which was the int8 text encoder on CPU chewing a 45k-token prompt.
retention_analysis: <Subject 1> (appears in every shot): fully_preserved - character design, face, hair, jersey and kitenge are preserved exactly. <Video 1>: attribute_transfer - skateboard motion, body pose, camera movements, shot timing and frame composition are preserved. <Picture 2>: weak reference - colour, architecture and environment reference only.
The ride, the cuts, the Walkman insert and the camera all transferred, and the rider is our girl. But the alley transferred too: the source's Japanese houses and hillside stayed under her, and the Ntinda plate only surfaces in the last close-ups. The schema says exactly why —<Picture 2>: weak reference loses to<Video 1>: attribute_transfer for the environment. The one-variable retry flips the plate to fully_preserved and names the alley as not preserved.

Source · 5a (plate weak reference) · 5b (plate fully_preserved). 2269 s on the 3090 to learn that the alley still wins every wide.
It did not move. In H3's video-edit mode <Video 1> owns the environment whatever the retention text says — the mode is an in-world identity swap, and it is very good at that. For our world, the tool is the one rungs 2 and 8 already use: the source clip as ref_videos in reference-to-video, where the plate wins. Replacing a background through video-edit would need the skater matted out over the plate first.
Rung 6 — a 2× upscale that never leaves latent space, and the four things in its way
The LBH 3D latent upscaler resizes H3's latent 2× and the same video VAE decodes it — no pixel round-trip. Wiring it took four failures, each of which is now a test or an installer line: the node's mode is a V3 dynamic combo whose option travels as a prefixed key (mode.scale); H3's sampler emits a nested video+audio latent that no core node unpacks, so the repo grew a two-node split/join pack; restarting the GPU sidecar to load it crash-looped 22 times on git'ssafe.directory check for the unit user; and the unit'sUser= had drifted from its own installer, so the final save was refused. Fourth run:
seed 7400, 512x896x124 -> 1024x1792x124, RTX 4090, 447 s for the whole run incl. upscale + 2x decode
Lanczos 2x of first pass latent 2x
Laplacian sharpness (mean, 124 frames) 95 309 (+226%)
mean |diff| vs the Lanczos frames - 5.9 / 255
temporal flicker proxy (frame-to-frame diff) 10.15 10.19 (no added flicker)
Same frame at 2.2 s, same 480-px crop. Left: Lanczos 2×. Right: latent 2× — the kitenge weave and the jersey seams come back as drawn lines. A slight warm shift is the price.
Compare an upscaler against the cheap baseline on the same frames, with a sharpness proxy and a flicker proxy — sharper-but-flickering would be a loss. The tiled refine pass over the larger latent is a separate, heavier technique; this rung proves the resizer alone.
Rung 7 — one girl, six actions, and a plank

push · crouch · ollie · turn · sit · wave — 512×896×56 each, r2v + turbo4-r2v, seeds 7500–7505, one cast sheet.
The ollie plate — real airborne frames, board under her feet.

Same jersey, same kitenge, same earrings, same sneakers across six different prompts — the cast sheet holds, which is the entire point of a coverage set: a later shot can reference her doing the action instead of inventing her. Five of six are registered as a modular reference. The sixth: "she stands holding the board upright beside her" rendered a wooden paddle. The model has no memory of the previous clause. A board is a board. Name the prop fully every time it appears; v2 says "her SKATEBOARD, one hand on its nose, wheels toward camera".

v1 vs v2. Same seed family, one wording change, 197 s on the 3090. The coverage sheet now carries six good plates.
Rung 8 — a crane and a whip, proven with numbers before a single render

Crane: frames 0 · 24 · 40 · 46 · 52 · 80 · 123. Eye height to 9 m with the aim pinned 30 m down the road; the tin roofs open out below the lens.

Whip: hold on the shopfront row for 40 frames, 90° in 12 frames, hold down the road.
$ blender --background --python blender/city_previz.py -- --glb ntinda.glb \
--road "Ntinda Kigowa Road" --clip --move crane --measure
f 1 z= 1.65 m heading= 6.4 deg pitch= -0.0 deg
f 40 z= 3.40 m heading= 6.4 deg pitch= 3.3 deg
f 52 z= 4.39 m heading= 6.4 deg pitch= 5.1 deg
f124 z= 9.00 m heading= 6.4 deg pitch= 13.8 deg
$ ... --move whip --measure
f 40 z= 1.65 m heading= 276.4 deg
f 52 z= 1.65 m heading= 6.4 degThe previz directory has a law: grey contact sheets lie, so a rig fact is a number read off the evaluated scene. --measure makes that mechanical. Both clips are the H3 ship canvas exactly (512×896, 24 fps, 124 frames) and are registered as references.
rung8-ntinda-crane — seed 7800, 580 s on the 4090. The crane clip as ref_videos, the plate as <Picture 2>.

Eye level as she pushes off; the lens rises; the last forty frames are a high wide over the tin roofs of Ntinda — the block-out's end pose, which is what the render commits to hardest. A camera move the model would never invent on its own is one grey clip away.

rung8b-ntinda-whip — seed 7801, 564 s. Hold on the shopfront row (with a car the model invented), three frames of genuine smear exactly where the block-out turns, landing on her down the road.
The whip transfers too. What drifts is the street after the turn: a hold-then-turn asks the model to invent the second view, and it re-establishes the road from a new angle with more trees and poles than the plate has. A second plate for the landing view, or a two-shot multishot, would pin it.
Rung 9 — a storm on a sub-second clock
rung9-ntinda-storm-vfx — seed 7900, 888 s on the 3090. Dry dust, then a Kampala afternoon storm arriving mid-shot.
detailed_description: At 00:00.000 dry warm light, dust behind the board. At 00:01.600 the light begins to dim. At 00:02.000 the sky is slate grey. At 00:02.300 the first drops hit the road and burst in the dust. At 00:02.700 the downpour arrives as a wall, diagonal ink streaks fill the frame. At 00:03.000 she pulls the jersey over her head. At 00:03.400 cut to the static wide. At 00:04.200 she exits frame right, spray off the wheels. At 00:05.100 the street holds under full rain. mean frame luminance: 1.0s 118.8 1.6s 101.2 2.0s 85.6 2.3s 78.6 2.7-5.1s ~78 held

The clock is honoured to about a tenth of a second: the light starts dropping at the written 1.6 s, is slate by 2.0, and holds. Splash rings in the dust at the first drops, the jersey over her head, spray sheeting off the wheels in the static wide, the plate's kiosks unchanged under the weather. What did not land: the "hard diagonal ink streaks" are faint. A state change — light, wet, sky — obeys a timestamp; a texture does not. Rain as streaks wants a rain variant of the plate, or a named referent.
Rung 10 — two voices in one generation, and a words-per-second budget
rung10-ntinda-rolex-dialogue — seed 7700, 512×896×124, r2v-int8 + turbo4-r2v, 380.7 s on the 3090. Sound on.

[Shot 1] 0s to 1.6s — medium shot over the vendor's shoulder onto the skater, board under her foot, she leans on the cart and says warmly, Ugandan English: <d>[English] Ssebo, one Rolex — two eggs, no onions.</d> [Shot 2] 1.6s to 3.2s — reverse: medium shot over her shoulder onto the vendor, who cracks an egg onto the pan with one hand and answers without looking up, dry, amused: <d>[English] Two eggs is two thousand five hundred, my sister.</d> [Shot 3] 3.2s to 5.1s — two-shot from the roadside, both in frame, the pan steaming between them; she laughs, digs a folded note out of the kitenge and holds it out: <d>[English] Eh! Since when? Okay, okay — take.</d> detailed_description: At 00:00.200 she speaks in shot 1. At 00:01.600 the cut to the reverse. At 00:01.800 the egg hits the pan and he speaks. At 00:03.200 the cut to the two-shot. At 00:03.400 she laughs and speaks, holding out the note. ...
Three cuts at the written times, the same girl and the same vendor on both sides of every cut, the egg and the note and the chapati flip on cue. Whisper transcribed the audio with timestamps:
[00:00.000 --> 00:01.680] Seven, one Rolex, two eggs, no onions. [00:01.680 --> 00:03.040] Two eggs is two for my sister. [00:03.040 --> 00:04.280] Eh, since when? [00:04.280 --> 00:05.280] Okay, okay, take.
Every line sits inside its own shot window. "Ssebo" heard as "Seven" is at least half the transcriber's fault with a Luganda honorific. "Two thousand five hundred" is simply gone: nine words in a 1.6-second shot is 5.6 words per second and the model dropped the middle. Budget dialogue at about four words per second of shot, or give the shot the seconds. The fleet-level finding from this rung is that the inference router had no speech-to-text backend registered — the check ran on the workstation — and that is now a ticket, not a workaround.
Then the director's note on v1, verbatim: "the digits cannot be wooden otherwise there is no way to fry the Rolex; the pacing is not bad but we need all the proper steps including rolling the Rolex, and usually they give you the Rolex in a transparent kaveera." That is a reality-grounding failure, not a style note — the function of the place was under-specified, so the model drew a vendor who could not do his job. v2 defines the hands as human in the subject definitions and the negatives, writes the procedure as timed beats, goes to 243 frames, and trims the lines to the words-per-second budget.
rung10v2-ntinda-rolex-full — seed 7710, 512×896×243, 586 s on the 3090. Sound on.

[00:00.000 --> 00:02.000] Sebo, one Rolex, two eggs. [00:03.900 --> 00:05.400] Two five, my sister. [00:07.800 --> 00:09.800] Eh, since when? Okay, take.
Eggs into the steel bowl, beaten with a fork, poured, the chapati laid on the omelette, lifted and flipped, rolled tight with both hands, slid into a clear kaveera, handed over, the note taken, the first bite. Three lines, verbatim, each inside its window. The filling — tomato, onion, cabbage — is still never shown, and that is now a line item in a reality audit for the location, borrowed from a production-controller skill worth reading in full: five layers — function, must-have equipment, topology, flow, running state — checked before the place is drawn.

The audit made into a plate: a crop of the street plate, Qwen-Image at denoise 0.72 with the must-have list as the prompt — sigiri and pan, steel bowl and fork, a tray of eggs, chapati in clear bags, tomato, onion and cabbage, oil, spatula, kaveera hanging from the frame, a rolled Rolex in its bag. It is now the location's plate in the series file.

v3 against that plate — seed 7710, 392 s on the 4090. The filling bowls, the egg tray, the oil and the kaveera are in every stand shot; crack, pour, chapati, flip, roll, bag, note, bite; the same three lines verbatim. The audit's frames layer passes.
The first assembled cut, and what the gate said
Ten rungs are not a film. The baseline the directive asks for is one cut through the film gate, so: skate-through → crane → Rolex stand → storm, every shot against plate v3, hard cuts, 25.6 seconds. The gate's flow layer finds the cuts; a vision model describes each shot neutrally; a text judge reads the ordered descriptions against the story and five named key moments.
Ntinda baseline cut v2. Sound on for the stand.

v1 (five shots incl. the whip, 0.4 s crossfades) STORY_READS: no crossfades merged crane+whip into one 12.4 s "take"; the whip's invented car reads as a break; the storm opens dry after the payment, so the rain reads as an insert v1 hard-cut re-run STORY_READS: no -- for different reasons v2 (four shots, hard cuts, all plate v3) STORY_READS: no, verdict: recut KEY MOMENTS 4/5 present: push-off, the roll, the kaveera hand-over + payment, the rain missing: "the camera rises above the tin roofs" -- the describer reads the crane's high wide as "a lone figure walking"; it cannot see camera motion at all
Two of the three verdicts are about the gate, not the film: a describer that cannot see a camera rise will never find a crane, and two runs on the same cut disagreed on whether the roll was there. Both are now queued work — a measured camera-motion descriptor per shot, a three-pass judge that reports agreement, and per-shot trims in the cut list so the storm can start where the storm starts. The cut stands as the reference until those land; the film reads to a person, and four of five moments read to the machine.
Then the director watched it, and the notes were facts
"The digits cannot be wooden otherwise there is no way to fry the Rolex." "When she is rolling back in the rain she magically gets a shawl from somewhere instead of using the wrapper she already has around her waist." "Most people don't have that style of cassette player — she would have a kabiriti." "Rolex stands are semi-permanent, not on wheels." "Kampala is usually busy — just a bit more busy." "Name the characters, give them back stories, fashion sense. Create a full story." None of these is a style note. Each is a thing the model could not know and I had not written down, so each became structure in the series file rather than a fix in a prompt.
The series now has a bible. Suubi Nakato, nineteen, a twin, an S6 leaver waiting on Makerere and working mornings at her mother's tailoring stall; the board was her brother's. She rides with one wired earphone in, the cable to a feature phone in her jersey pocket, and the ochre-and-red kitenge at her waist is the most useful thing she owns — seat, bag, shade, and the thing she pulls over her head when it rains. Kato Ssemakula, thirty-four, from Masaka in 2016 with a griddle and a charcoal drum; the board says DELICIOUS SNACKS but the road says Kato's. Kufi cap, plaid shirt with the sleeves rolled, white apron, blue beads, Bukedde FM in one ear. Each character has a carries: list, and a prop that is not on the list may not appear.

The stand as it is: a reference photo → a cel plate at denoise 0.62. A table on legs under a yellow umbrella, the painted menu board, the griddle on a drum, eggs, chapati in bags, the filling, an airtel-money sign. Not on wheels.

Street v3 → v4: a boda rider in a vest, a woman with a basin, schoolchildren, a man at the kiosk — at 0.45, the one strength that adds life and keeps the street (0.5 rewrote the signs). Right: Kato's sheet from the bible.

The stand scene against that plate with both sheets — seed 7710, 397 s. "Kato, one Rolex, two eggs, no onions." / "Two-five, Suubi." / "Eh, since when? Okay, take." — verbatim.
The full story is three parts on one road — Kigowa afternoon, Kato's,The storm — five shots, every location a plate, the wrapper as the hood in the rain, rendering as this goes up. One compiler change came with it: a shot may now carry its own frame count, because a ten-second dialogue block and a five-second street block belong in the same series. The first version of that change leaked the override into the shots after it; a test caught it and two shots were re-rendered. That is what the tests are for.
"Two-five" — a short, not a list of fixes
The second round of notes was sharper: she rolls away and comes back; we never see her arrive; the conversation is too short and too polite — people bargain, you wait ten minutes, the Rolex is not a perfect circle, he flattens the chapati with his hand, the stoves are not fancy, the rain is out of place. And then: "I don't need you to rewrite the story as per my notes, I need a compelling, plausible, consistent story." So this is a short with a shape. Suubi's admission text arrives on her kabiriti at her mother's stall; Mama reads it over her glasses, says nothing about it, and asks for a Rolex. Suubi rides out left to right; the crane shows the yellow umbrella at the far end of the road; the stand is busy; two Rolex are five thousand; "Kato, I am your customer!"; "Eggs went up, ask your mother"; "Four — I am leaving for Makerere" — and Kato stops beating the egg. She waits on the bench while the sky greys and he flattens a lopsided chapati onto a ragged egg. The first drops fall at the hand-over. She pulls the wrapper over her head and rides home right to left in a drizzle, and her mother reads her face before she says a word.

New for the short: Mama Nakato's tailoring stall (NAKATO TAILORS) as a plate, and her sheet. The stall is screen-left, Kato's is screen-right; that sentence is the continuity plan.

Part 1, the letter: the stall, the kabiriti insert ("MAKERERE UNIVERSITY: ADMITTED" on a keypad phone), the two-shot; "Go and bring me a Rolex from Kato. Two eggs." verbatim.
Consistency between blocks was supposed to be a mechanism: pin the previous block's last frame as frame 0 of the next, the way the speedpaint rung chained and the way the community describes "handing the previous shot back to the model". So it was measured. Push-off's first frame sits 56.5/255 from the letter block's last frame — a hard cut's distance (62.3 is a cut inside the same block; 75.4 is two and a half seconds of one clip). Under the reference-to-video model the guide is a composition hint, not a pin. What actually keeps the short continuous is the boring part: one plate per place, a stated screen direction per leg (out left to right, home right to left), and the stall on screen-left and the stand on screen-right in every sentence of the script.

The chain check: last frame of the letter block, first frame of push-off, and the distance between them next to the distances inside a single clip.
The stove, and a lesson about prompts
"WHY is the charcoal stove still on the wooden platform?" Every reference photo has the griddle on its own drum on the ground beside the table; every plate and render had it on the counter. Three whole-image edits failed — one of them took the word CORRECTION literally:

An image prompt is a description, never an instruction. The model painted "CARRECTION NO PAN" onto the signboard and left the pan where it was.

What worked: a masked inpaint — a latent noise mask so only the pan region repaints at denoise 0.95, then a second mask to put the griddle on the drum. Table bare, stove on the ground. The masks are committed next to the plate.
The short, rendered — nine blocks, two cards, and two refusals worth keeping
Nine blocks at review quality (512×896, the int8 reference-to-video model, the turbo LoRA, eight steps), split across the two NVIDIA cards by their chain parents: the street lane on the 3090, the stand lane on the 4090 chained off the crane's last frame. Every block carries a receipt with its resolved graph and wall time; the strips below are one frame per second.

Part 1, push-off (chained, dolly reference video): out LEFT→RIGHT past the pharmacy, a boda in a reflective vest, the street a bit busier and no worse for it. 833 s on the 3090 — a reference video roughly doubles a block's cost.

Part 2, the crane (rung 8's measured move as a reference video): the camera lifts over the tin roofs and the yellow umbrella appears at the far end of the road. 841 s.

Arrival, chained off the crane: she stops at a stand that is already busy, and Kato hands a boda rider his Rolex before he looks at her. That is the "why aren't we showing her arriving" note, answered. 402 s on the 4090.

The bargain, 243 frames in one generation: six lines, every one heard verbatim by whisper — "Two Rolex, five thousand" / "Five? Kato, I am your customer" / "Eggs went up, ask your mother" / "Four, I am leaving for Makerere" / "Makerere… four then." 293 s, 36.6 s per step.

The wait, the reality audit on screen: the drum stove on the ground beside the table, egg with tomato and cabbage poured ragged, the chapati flattened by hand, a loose roll into a clear bag, Suubi on the bench under a sky going grey. 443 s.

Drizzle: two clear bags handed over, the kitenge wrapper goes over her head — the wrapper she has worn since the first frame, not a shawl from nowhere. "Greet Mama. Makerere also eats Rolex. Come back!" 264 s.
Two refusals taught something and both are now code. The 243-frame block is 32,256 tokens, above the renderer's 17k ceiling — a number measured on the 32 GB AMD cards and never on these. The bargain block had gone through the renderer directly with the ceiling raised; the lane runner had no way to say the same thing, so the wait block was refused. The lane runner now forwards a deliberately raised ceiling. And three lanes in a row were refused for "6.5 GB free, needs 21 GB" on a card held by nothing but the same server's models from its previous render, each time cleared by a human posting the unload the refusal itself recommended. A refusal whose fix is mechanical and safe is a step the preflight should take: it now unloads an idle instance's own models, re-measures, and refuses only if it is still short. Seven tests hold the branches, including "never touch a busy queue".
v1 to v2: the handbag, and a chain across a cut

Ride home, v1: right to left in the drizzle, wrapper as hood, the road starting to shine — and a blue handbag that is on nobody's sheet. The script said "two bags". A bag unqualified is a handbag; the Rolex travels in a clear kaveera and the script now says so every time.

Mama, v1: chained to the ride-home's last frame — an empty street after she exited — so the block opens on that street and re-enters her riding away before the stall appears. The exact "rolls to the back of the street then comes back" note. A chain pins the previous frame; a location cut wants the location plate. The block is un-chained and opens wide on the stall.

Ride home, v2: two clear bags, a Rolex showing in each, and nothing else in her hands. 934 s on the 3090 with the dolly reference.

Mama, v2: the stall in the rain from frame one, she rolls in from the right, one clear bag held out, "Two eggs? — No onions." heard verbatim, and the pull-in. 367 s.
The cut, and a gate that could not see it
"Two-five" v2 — 56 seconds, nine blocks, review quality, assembled straight from the receipts. No colour work, no sound design beyond what the model generated.

One frame per second of the cut.
The film gate returned "recut", one of seven key moments present. It described the bargain as generic cooking close-ups, the clear bag as a medal, and missed the crane, the chapati and the wrapper. The transcripts and the strips above contradict it on all six. The describer watches frames with no sound and no camera sense, and the judge is unstable from run to run — the lane to fix that is queued and it was in this post before this cut existed. So the verdict is recorded next to the evidence, not obeyed. A gate that fails a film for beats you can hear is not a gate yet; it is a measurement of the gate.
Rung 11 — carry frames, not a frame
The note that kept coming back was about consistency between scenes. The mechanism in place was to pin the previous shot's last frame as the first frame of the next one. It measured 56.5 out of 255 at the join, and that number was written into a ledger as if it settled something. It settles nothing: the same distance is invisible in a whip pan and a hard cut in a locked-off two-shot, and it was measured by hand in a command nobody can run again.
So the first thing this rung built was the instrument. A join is now reported as a ratio of the next shot's own frame-to-frame motion, with fixed thresholds: at or below 1.5 the join costs less than one frame of that shot's movement, at or above 4 it is a cut whatever the mechanism claimed. Then one variable changed — the same shot, same prompt, same references, same camera block-out, same seed, same card, and only the guide swapped from the previous clip's last frame to its last five.
| guide | boundary | shot's own motion | ratio | verdict |
|---|---|---|---|---|
| one frame | 57.9 | 5.38 | 10.77× | cut |
| five frames | 30.7 | 10.82 | 2.84× | soft |
The second column is the finding, not the first. With one pinned frame the render starts from a standstill and has to accelerate, which is precisely what the eye reads as a jump; with a tail it inherits the previous shot's velocity and begins already moving. The boundary halves and the shot's own motion doubles.

The five frames that end the previous shot: the two-shot at the stall, the phone changing hands.

With one pinned frame, the next shot opens somewhere else entirely — a shopfront, the girl already rolling. A cut, measured at nearly eleven times the shot's own motion.

With five, the next shot opens on the two-shot it inherited and keeps going.

The whole shot: it holds the stall, her mother waves her off, and it moves out into the street ride past the pharmacy — two places in one generation with no cut between them. That is what the note was asking for.
Five frames is not a guess. The node pack on the render box exposes exactly this idea with a window of nought, one, five, twenty-two or thirty-nine frames, described as carrying a tail of each completed render into the next. The renderer here already chains one guide per frame index, so the window was expressible without adopting the heavier graph. Cost is unchanged, because a tail is conditioning rather than extra frames. And the older warning still stands: a tail across a genuine change of place hands the model the wrong location, so a tail is for continuous action and a plate is for a real cut.
Every join carries a tail now — the gate reads 7 of 7
The motion-tail mechanism from earlier only reached joins inside a single compiled part. Three of Two-five's seven continuous joins — riding out onto the road, arriving at the stand, leaving for home — each opened a NEW part, so they stayed hard cuts for a reason that was a compiler limitation, not a directing choice. A part can now say it continues the one before it, and its opening shot may pull a tail across that boundary. All seven continuous joins carry one; only the very first shot and the real change of place — leaving the stand for home — remain cuts, because that one actually is a cut.
"Two-five", fully tail-chained — 56 seconds, the same nine blocks, every continuous join now carrying the previous shot's motion across the boundary.

One frame per second. Watch the road: she rides out of the stall shot and is already moving when the crane shot begins, rather than starting again from a standstill.
Grading it exposed that the film gate itself still had two blind spots worth naming rather than working around again. Its shot detector finds cuts by looking for them, and on an assembled film made of known clips that is a coin flip it does not need to make — nine rendered blocks were coming back as twenty-one shots, because a crossfade inside one continuous block reads as a scene change. And a single frame cannot show a camera move, so the judge always read a crane shot as though the camera had never lifted. Both are fixed: when the blocks are known, their real lengths go straight in instead of being guessed at, and each shot's first and last frame now go to the judge side by side with a closed list of moves to choose from.
With the true shot boundaries and the transcript together, the gate reports all seven story beats present, correctly placed on the shots that actually carry them. It still calls for a recut — two of the nine blocks run longer than its pacing rule allows for a single take — and that is now a genuine note about the edit rather than the gate arguing with its own blind spots.
Rung 12 — borrowing a workflow, and measuring it before believing it
Someone on the Stable Diffusion forum posted that MiniMax H3 is the first open-weight video model worth using, that being able to hand it a character reference sheet shortens the loop enough that character and clothing LoRAs largely stop being necessary, and that its one real flaw is that people in it tend to speak Simlish. They shared their workflow. Their recipe differs from ours in four ways: a 16:9 canvas instead of portrait, twenty-two sampler steps instead of eight, no speed LoRA at all, and a multi-view character sheet rather than a single plate.
The honest way to take someone else's recipe is to run it against your own with one thing changed, not to adopt it because it is new. So: same card, same seed, same reference, same prompt, same canvas, and only the sampler swapped. The subject is Africanised, as everything on this ladder is — Nnalongo, a village diviner in her fifties, bark-cloth robe over an indigo wrapper, a collar of cowrie shells and blue glass beads, kaolin clay on her cheekbones, brass coils at her wrists and ankles, barefoot in a swept compound at night, calling a ring of light out of her cupped hands.

The reference sheet, drawn from nothing: full body, three-quarter mid-gesture, head and shoulders. Until this rung the image tool could only edit a picture that already existed, so a brand-new character was impossible to make.
Nnalongo, 1344×768, 124 frames, eight steps. The fire holds one side of the frame and she holds the other — an argument for the wider canvas on its own.
| sampler | steps | wall | sharpness | motion |
|---|---|---|---|---|
| ours, with the speed LoRA | 8 | 417 s | 79.8 | 15.05 |
| theirs, no LoRA | 22 | 959 s | 68.5 | 13.65 |
Their sampler costs more than twice the time and measures fourteen percent less detailed on this hardware. So we keep ours. But the other two things they brought are keepers and worked on the first attempt: the wide canvas, which every previous rung had never used, and the character sheet, which held her headwrap, her clay markings, the cowrie collar, the gourd and the brass coils across an entire clip with no LoRA at all. That was their central claim and it survived contact. Their Simlish complaint, incidentally, already has an answer here: tag the speech and keep it under about four words per second of shot, and it comes back verbatim.

The twenty-two step version. A cleaner spiral, softer overall — which is what a measurement is for: the difference is real, small, and not worth double the render.
Two instruments came out of this rung, both for the same reason. The ladder had been claiming sharpness improvements from numbers typed into a terminal and thrown away, exactly as it had been claiming a continuity number the same way. Both are now tools with tests, so every figure in the table above can be re-derived by anyone. And when the film gate failed this short a second time on lines that are plainly audible, the fix went into the gate rather than into another footnote: it now reads the transcript alongside the shots, because a judge that cannot hear will always report the spoken beats missing.
What the ladder is for
Each rung leaves a mechanism behind it in the repo — a renderer flag, a compiler feature, a previz camera move, a lint — and a lesson written next to the number that earned it. Queued behind this: the ledger with stale propagation, director intent and deviation records, cut trims, and a gate that can see a camera move. When the ten are in, the baseline for the long-form piece is everything above, assembled: plates, cast coverage, multishot blocks, a measured second pass, an upscale, and a gate that judges the film.
