promptdojo_

Fifty assets, one brand — locks, seeds, and the QA filter — step 1 of 9

Fifty assets that look like one hand made them

Here is the tell that separates a designer's AI output from an intern's: put twelve of the assets in a grid. The intern's twelve are twelve good images. Yours are twelve panels of one brand — same palette temperature, same line weight, same mascot with the same face, same air. Any single image can be lucky. A grid can't.

The enemy is that generation is sampling. Every render starts from random noise, so every unlocked variable gets re-rolled per asset. Run "halfmoon coffee illustration" fifty times and you get fifty interpretations — fifty stroke weights, fifty teals. Brand drift isn't a model bug; it's what "unlocked" means.

So the craft is locking. Four locks, cheapest first:

  1. The scaffold lock — every prompt in the batch is compiled from the same kit through the same scaffold (lessons 1 and 2). Only the subject slot varies. This alone kills most drift, and it's free.
  2. The style reference lock — instead of describing the look, show it: pass an approved asset as a style reference. Midjourney's --sref with a style weight (--sw) dials how hard the batch leans on it; the first hero image you approve becomes the style anchor for the other forty-nine. This is your style tile, operationalized.
  3. The character lock — for a mascot or recurring subject, style references aren't enough; you need the same entity, not the same vibe. In Midjourney that's omni-reference: --oref pointed at the approved mascot image, with --ow dialing how hard each render holds to it (check current vendor docs before you rely on the exact flags — mid-2026 names rotate). The other route is an edit-family model — as of mid-2026, something like FLUX.2 multi-reference editing or Seedream, both of which hold identity well — which takes an existing image plus an instruction — "same barista, now waving" — and preserves the subject's identity while changing the scene.
  4. The seed lock — the deepest lock: pin the random starting noise itself. Same seed + same prompt + same model = same image, which turns generation from a lottery into a controlled experiment. Next step, because it deserves its own.

When the deliverable is a screen

Deliverable #51 in that campaign kit is the launch landing page, and the same enemy lives there under a different name: component drift. A signup button that's 2px shorter on the pricing screen, three subtly different terracottas doing "primary" across five screens, body text that changes size between sections — that's the mascot's jaw changing shape, in interface clothes. And the locks map straight across:

  1. The scaffold lock is the token file from lesson 2: every screen compiled from the same color roles, type scale, and spacing grid, so "primary" resolves to one hex everywhere.
  2. The style-reference lock is the approved hero screen — the first screen the client signs off becomes the reference the rest are held against.
  3. The character lock is the component itself: a button is a mascot with a job, one entity reused on every screen, never redrawn from memory.
  4. And the QA filter checks screens for off-token values — a rogue hex, an off-grid margin — exactly the way it measures off-palette pixels in a feed crop.

Different canvas, same craft: lock what must not vary, then check anyway.

Locks compound. A batch with scaffold + sref + planned seeds doesn't ask the model to be consistent — it removes the model's opportunity to be inconsistent. Then the QA filter (later this lesson) catches whatever leaks through anyway, because something always leaks through, and the client review is not the place to find out what.