Regions, not repairs
Inpainting treats a mask as damage. PrismStream treats it as composition. Notes from six weeks of getting that distinction to survive training.
Most spatial control in image generation is bolted on after the fact. You train a model on whole images, then at sample time you mask a region and ask the model to fill it while pretending the rest was always there.
It works, mostly, and it fails in a characteristic way: the filled region is locally plausible and globally disconnected.
Conditioning during training
PrismStream puts region masks in the conditioning path from the first step. The model never learns that a mask means this part is broken; it learns that a mask means this part is specified.
The difference shows up most clearly in multi-region prompts, where the model has to reconcile two specifications that disagree about what belongs at the boundary. Repair-trained models pick one. Region-trained models negotiate.
What it cost
Six weeks, one abandoned architecture, and a conditioning encoder that is larger than we would like. We will publish the ablation once the runs finish.
Keep reading
The tail is the product
Why we throw away aggregate F1 on tagging benchmarks, and what we report instead. A short argument with a long table attached.
Filters are opinions, so ship the score
On building Aurora: why every quality filter in the pipeline emits a column instead of deleting a row, and what that costs in storage.
Scheduling for four GPUs
Kubernetes answers a question small labs are not asking. Notes on writing a scheduler whose main feature is explaining itself.