System 07 · October 2026
Batch QC-reel builder
Headless Nuke builds the review script: every candidate lined up at the same frame, one knob to switch them everywhere, a burn-in that carries the verdict, and a delivery QC that reads the render instead of trusting it.
Measured results
- Review script built headless 7 × 372 reels × frames Four review targets, seven reels from 1001 to 1372, one Viewer with views for AI over blue, reference over blue, both alphas, the red and cyan error view, the plate and a contact sheet.
- One knob 1 → 5 mattes, everywhere MATTE_CONTROL.matte switches the reference, the ensemble and three single models in every column at once, so a review is a knob change, not a rewire.
- Delivery QC catches 344 frozen frames On a real render: 625 frames written against a 216-frame plate. Another render had 6 missing frames and 13 temp files. Both caught before the client did.
- Read errors at build 0 in the log The builder checks that every OCIO colourspace it sets is offered by the config, because Nuke silently accepts an invalid one and errors only at render, and strips the TCL characters from burn-in data so a gate message cannot execute.
Problem
Comparing five mattes on four shots by hand means forty Reads, twenty Switches and an afternoon, and the script is wrong somewhere. Delivery QC was a person scrubbing a render. One job shipped a 625-frame render against a 216-frame plate before anyone counted.
Method
A Python builder runs in headless Nuke and writes the script from data: one column per review target, every matte as a stream, a single control knob driving a Switch in every column, seven AppendClip reels from frame 1001 so the same frame is the same moment in every reel, a burn-in bar above the picture with shot, metrics and verdict from a JSON of scores, and one Viewer with seven named views. With a proof folder it also checks the switch and the burn-in at every column start and renders every reel once per column. The delivery QC is a separate script that counts frames against the plate and the range, finds black and frozen frames, and checks fps and codec against the job spec.
In production
The builder is the unglamorous half of the AI matte bench: the bench produces numbers, and the review script is how a person checks the numbers against the picture without rebuilding the comparison each round. Because the script is written from data, the same builder produces an artist QC for a delivery (every version of every shot at frame 1001, one reel per shot) and a game-shot QC reel for a campaign with dozens of near-identical plates.
Two traps cost real time and are now checks in the code. Nuke’s colourspace menus take entries of the form name, tab, menu path, and a Read given a name the config does not offer accepts it silently and errors only at render; the builder splits the entry and verifies the name is offered. Burn-in strings go through TCL substitution, so any bracket or dollar sign in data would execute; the builder strips them. Both are the kind of thing a reel shows in one second and a résumé cannot.
The delivery QC is where the measured value is clearest. A 625-frame render against a 216-frame plate, with 344 frozen frames, is a mistake a tired artist makes at two in the morning and a client finds on the first play. The script found it in a second, and the package step records a checksum for every file it ships.
Next: measure the build time for the reel (the log carries no timing yet) and move the game-shot builder off the shared mount so the capture can be clearance-free.