
Route The Shot, Not The Render
10 rows, 7 models and 2 routes retired outright. The table is built from live probes rather than vendor claims, because every model is strong at 1 job and disqualified at the rest. The default aspect ratio is 1 to 1 and it returns a square frame every time it is not set.
10 Rows, 3 Columns And 1 Rule At The Top
The routing table has 10 rows. Each row is 1 task type, and each row carries 3 columns: the model to run, the fallback, and the verdict. The verdict column is the only one that matters, because it is the only column with a test behind it. It was assembled from live render and API probes rather than from vendor documentation. That distinction is the whole reason the table exists. A model card describes what a model is, and a probe describes what a model did on 1 specific task at 1 specific resolution with 1 specific parameter set. Those 2 documents disagree often enough that the second one is the only one worth routing on. The rule sits at the top of the page in 1 line. A routing decision changes when a new model beats the incumbent on a live render or API test. It changes on nothing else. Not on a benchmark chart, not on a launch post, not on the opinion of whoever posted the most confident thread that week. That rule has teeth because it is cheap to apply. 1 render is the smallest possible test. Firing 1 shot and reading the result back costs less than the meeting about whether to fire the shot. So the table is not a preference list. It is a record of what was measured, and it stays accurate only while the measurements keep arriving. 10 rows. 3 columns. 1 rule.
1 Job Each, And Genuinely Strong At It
No model in the table is general. Each one owns a task and fails the rest, and the failures are as well documented as the wins. The production renderer is Wiro on seedream-v5-pro-uncensored for a still that has to anchor an identity to a fixed face. It runs at 2K in 16 to 9 with up to 10 reference images, and it is the renderer the whole pipeline is built around, because nothing downstream survives a wrong still. The second Wiro model, seedance-2-5-uncensored, takes uncensored body and dance stills and then the video, from 4 to 30 seconds. It holds the longest image-conditioned path in the table at 30 seconds, which is the number that decides whether a shot can be planned in 1 take. OpenArt Vibe Direct is the lip-sync route and it is in the table for 1 reason: it is the only renderer that holds face identity while it syncs audio. Everything else in the fleet drops the face at the moment speech starts. MiniMax Hailuo-2.3 image-to-video runs 10 seconds at 1364 by 768 at 24 frames per second on the coding-plan key, which makes it free at the margin. That is not a small line. 1 shared monthly quota means the high-volume work belongs here and the specialists get reserved for the shots that cannot be done any other way. S2V-01 accepts 15 seconds, and it needs a clear face or character as the subject. Ask it for a faceless back view and it returns unexpected error 1000, which is the tool telling the truth about what it is. H3 is the long high-resolution door at 15 seconds and 2K. It is plan-gated on the coding key and answers with code 2013, so it runs on pay-as-you-go credits only. 7 models, 7 jobs. That is the shape of the whole table.
The 2 Routes That Were Retired, And Why
Two routes were removed from the fleet this year, and both were removed on evidence. Grok imagine was the renderer and it is now the vision gate. The reason is fidelity: worst of the 3 tested. The proof was not an opinion, it was b-roll b01 through b20, cut side by side against the same shots from the other 2 renderers. A frame that renders as a soft illustration cannot be graded into a documentary photograph, and no amount of prompt work moves it. The prompt pack written for that renderer still earns its place as a craft reference. The renderer does not. Wan 2.7 and 3.0 were retired for 2 failures, and the 2 are worth naming separately because they cost differently. The first is ethnicity drift. Ask for a child with the ethnicity left unspecified and the model returns the majority look of its training data, so the child arrives with a face nobody asked for. The prompt was not wrong. The prompt was silent, and silence is filled by the average. The second is the look. Photorealistic plus a blanket cinematic instruction ran through that model and produced a glossy, uncanny, obviously synthetic frame. 2 adjectives and 1 model family, and the output reads as a render rather than as a photograph. Both failures share 1 cause. The unset fields are not neutral; they are filled by whatever the training data averaged out to. That is why the fix is written into every prompt rather than trusted to the tool, and why identity is named in 3 tokens on every single generation. 2 routes, 2 lessons, 1 rule about silence.
2 Codes, 1 Case-Sensitive Token And The Square Frame
The operational failures are the ones that cost a batch, and they are all cheap to learn once. Code 97 is insufficient balance. It is a hard stop and it is not retryable, so it kills the rest of the queue until the account is topped up. Code 96 is a concurrent task limit. Wait about 30 seconds and retry, or run 1 job at a time and remove the error from the list permanently. Treating those 2 the same is the mistake, because 1 is a money problem and the other is a queue problem. Resolution strings are case sensitive on the MiniMax video path. 768P resolves and 768p errors. The difference is 1 character of case and it produces a failure that reads like a broken account rather than a broken string. The production renderer has no separate negative field, so the negative block is appended to the prompt tail under a single avoid prefix. 1 string, not 2 boxes, which is a real difference when the block is 44 terms long. The default aspect ratio is 1 to 1. It returns a square frame every single time it is not set explicitly, and it is the parameter that wastes the most money, because the render succeeds and the output is unusable. Every request also carries a browser User-Agent. Without it Cloudflare answers 403 with code 1010, which looks like a permission problem on an account that has full permission. Then there is the guard that is most often misread. The first-frame still comes back flagged as a real human detected, and the run ends on a content policy line. It is not a sexual-content decision. It is a deepfake guard sitting on the first frame, and any readable face trips it regardless of what the frame contains. Explicit content has rendered clean on the same account. So the fix is framing, not censorship: silhouette, from behind, neck down, deep shadow across the features, and never a facial feature named in the prompt. 6 quirks, 1 shared property. Each of them fails without a sentence a human can act on.
Every model is strong at 1 job. The table exists because the same model is disqualified at the other 9.
Scene Lock Is Not Character Lock
Fast-H3 turns 1 prompt into synchronized video and stereo audio in a single file. It costs about $0.175 a run, runs 15 seconds native, which is 14.375 seconds or 345 frames at 24 frames per second, and it is fixed at 16 to 9 in 480P or 768P. It is text and audio only: no image-to-video, no reference input, and no identity carried across generations. That last limit was tested properly on 2026-08-31 rather than assumed. The same seed plus a verbatim identity block across a multi-shot two-hander produced a scene lock at roughly 85 to 90 per cent. Same room, same light, same archetype, recognisably the same world. It did not produce a character lock. The face, the coat and the tie all drifted between takes, and the B1 gate failed on exactly that. The repair that worked is 1 idea applied 3 ways. A per-character framing lock: a byte-identical identity block for each character, a fixed seed per character, and locked framing across the shots. The drift stops being random at that point and becomes a property of the framing, which is something an operator controls. That is the difference between 2 tools. A renderer that returns 1 beautiful frame is a still tool with a video feature. A renderer with a framing lock becomes a shot and reverse-shot tool, and the thing it produces is the same actor in different takes. Test the lock, not the sample. The sample is the take that happened to work.
The Scoring Engine And The 10 Euro Route
Every model is scored 1 to 5 on 7 axes: fidelity, consistency, control, cost, speed, availability and uncensored capability. For video work the weights are fidelity 30, consistency 25, control 20, cost 10, speed 10 and uncensored 5, which adds to 100 and tells you where the argument goes when 2 models disagree. Fidelity and consistency carry 55 of the 100, because a cheap frame that cannot be repeated is not a cheap frame. The cheap automated route has its own row and its own honest verdict. The Seedance API runs about 10 euros an output and is fully automated, with no LoRA control available, because that API is a closed box. The output is flat. The documented substitute for missing style control is to render as flat and as desaturated as possible, describe it as raw footage, and grade it externally. The grade is not a finishing touch. It is half the pipeline. The same discipline applies to text models, which sit in the same table. MiniMax M3 runs at $1.20 per million output tokens on a plan that already carries 5.1B tokens a month and renews on 2026-09-28, with a 1M context and multimodal input. DeepSeek V4 Pro is the cheapest overflow at $0.87 and it is text only, with no vision. GLM-5.3 is $4.40 for the hardest reasoning. Kimi K3 is $15.00 and has the best eyes. Grok 4.3 and 4.6 sit at $2.50 in and $6.00 out with no clear win. And Nous Hermes-4 is simply dead: 401, invalid, blocked or out of funds. 8 cross-model laws sit under the table and they apply to every row. Still before video, always, because a wrong still burned into video is the expensive failure. Identity locked in 3 tokens on every generation. Negatives on every render. Documentary language instead of photorealistic. Lighting written as an exact specification rather than a mood. 1 concurrent task on the production renderer. The key validated before anything is built on it, because a 429 means no credits and a 401 means the wrong key. 30 years of building, in 12 countries, under 2 rules: work with what the constraint allows, and refuse the version that looks better on paper than it can look in the room. Built companies across twelve countries. Restructured an industrial group. Deployed 210 energy systems. Took a company through a Frankfurt IPO. Built 200 wood-gasification machines. Signed a personal guarantee on a company that folded on Christmas Day 2008. In the building for the 2003 blackout. 393 pages in paperback, published 8 April 2026. The probability that a routing table built from live probes is out of date within 6 months is high. The probability that a routing decision taken from a launch post survives its first render is close to zero, and most teams are still pricing that second probability as though it were high. So the whole method fits on 1 page. 10 rows. 7 models. 2 retirements. 2 error codes. 1 framing lock. 1 default parameter to overwrite, every single time.
A routing decision changes when a new model beats the incumbent on a live render or API test. Never on a press release.
The map is dead. Nobody told you.
Bali State of Mind is the survival guide for the collapse of everything you were taught to believe.
Beyond this book
Building the same thing somewhere else.
Julien Uhlig is available for advisory work, board seats and media appearances. Write to media@exventure.co.
The academy that trains the operators, across every company in the group, is EX Epic Academy - 25,000 applications, 12 per cohort, 200+ alumni across 19 countries. academy.epicsolutiongroup.com
18-20 November. Online, Las Palmas, Bali.
Three days on what happens to work, capital and institutions when the map stops matching the ground. Seats are limited by cohort.
ex-aisummit.com →