The disagreement that made me rebuild the whole thing
I was staring at two numbers that flatly contradicted each other, and one of them was about to ship a wrong red. I had run a single AI-generated holiday creative through two checks at once. A generic perceptual-hash baseline, the honest stand-in for the "just score it with a similarity model" reflex, rated the asset 0.968, call it 0.97, on-brand. In production that clears. It ships. At the same instant, a real CIEDE2000 color-difference measurement put the asset's dominant hero red at ΔE00 7.12 away from the brand's crimson (PMS 484, #9E2B25), against a tolerance of 3.0. One check said "looks fine." The color science said "this is a different red." They could not both be right, and the similarity score was the one about to be wrong in public.
The off-brand red asset (a08). The generic similarity baseline scored it 0.968 on-brand and would have shipped it; CIEDE2000 measured it 7.12 ΔE off Lumiere Crimson against a 3.0 tolerance and blocked it.
That gap is not a rounding error. A generic similarity or aesthetic score is built on luminance and structure, so it genuinely cannot tell a correct Pantone red from a competitor's. It was never designed to. I had been treating "it looks close" as if it meant "it is on-spec," and those are different claims. That single disagreement is the reason I stopped trusting a model to be the thing that decides what ships.
My first instinct was to let a model grade the creative
My first design, the one I no longer defend, was to have an AI model look at each asset and score how on-brand it was. It felt modern and it demoed well. Then I fed it the hard case above, and the whole premise came apart in an afternoon: a scorer that leans on overall similarity waves through the exact failure a brand governance team exists to catch. I spent that afternoon trying to coax the model into being stricter about color, and every version either got pedantic about the wrong things or shrugged the real miss through. I could tune it toward one asset and lose the next.
The lesson stuck harder than I expected. The bottleneck in AI creative was never generation. Enterprises can already produce hundreds of variants a week. What none of them can do is eyeball all of it for the exact red, the logo clear-space, and the per-market disclosure law. And the cost of getting it wrong is now measured: Gartner (March 2026) found 50% of consumers prefer brands that avoid GenAI content, and Adobe's 2026 Digital Trends put it more bluntly, with roughly one-third of consumers saying they stop interacting with a brand once its content is revealed as AI. An asset that "looks fine" to a similarity score and is off-spec to the brand book is exactly the asset that erodes that trust.
So I moved the verdict out of the model
I made the call to take the decision away from the model entirely, and I have not regretted it once. The verdict in this demo is plain Python that sits outside any LLM. Color fidelity is judged in real CIEDE2000, the ISO/CIE-standard color-difference metric, against the brand's per-color Pantone tolerance. Logo clear-space is measured in pixels against the brand rule. Per-market AI-disclosure obligations are mapped from the asset's provenance to real, dated statutes. Each asset comes out as PASS, FLAG, or BLOCK, and each verdict is backed by a measurement I can point at, not a vibe I have to trust. The off-brand red is a hard BLOCK because 7.12 is over 3.0, and that is the entire argument. No persuasion, no model mood.
I kept the LLM. I just demoted it. There is one advisory vision-and-language step that adds a tonal, human-readable note on anything routed for review, and it is informational only. It abstains on a missing key or an error, and it never changes a PASS, FLAG, or BLOCK. The gate decides; the model only adds color. I wrote a unit test to make that non-negotiable: no asset with a hard failure is ever allowed to pass or flag. That invariant, plus the CIEDE2000 implementation checked against the Sharma et al. reference color pairs, is part of a small suite that runs 5 of 5 green. The color-difference math is not my invention I have to defend; it is a published standard I am holding assets against.
The cases I made sure the gate would never bluff
I care most about the cases where a lazy system would rather fake a clean answer than admit it should not decide. Two of them are deliberately not BLOCKs and not PASSes. One creative in the batch carries an AI-generated human face. Every deterministic measurement on it is clean, so a scoring model would happily wave it through at 100. The gate instead returns FLAG and routes it to a person for authenticity sign-off, because an AI likeness is a judgment a human should own (the "negative halo" NielsenIQ has documented for AI-generated faces). Another creative targets a market outside the brand book's coverage, so the disclosure rules are unknown; rather than falsely clear it, the gate marks it OUTSIDE COVERAGE and sends it to legal.
The AI-face creative (a11). Deterministic checks are all clean, so a scoring model would pass it at 100. The gate flags it for a human instead of bluffing a verdict it should not own.
I want the honesty to run in both directions. When the pixels are wrong, the gate blocks without asking permission. When the call belongs to a human, the gate says so out loud instead of guessing. That is the difference I was trying to build: a system that knows the boundary of what it is allowed to decide.
What I keep coming back to
I keep thinking about proof, because that is the part a demo makes concrete. On the fixed 12-asset batch in this demo, the deterministic engine clears 7 to ship, blocks 3, and flags 2 (a 58.3% auto-clear on that batch, not a promise about yours). The point I care about is the one at the far right of the report: exactly one asset was caught by ΔE00 that a generic similarity score would have missed. Every cleared asset exports a Brand Fidelity Certificate, a reproducible JSON-and-HTML record of each check's measurement, the provenance, the per-market disclosure status, and the verdict. It is a filable audit artifact, not a legal certification, and I keep it deliberately modest about that. The brand under test, "Lumiere," is synthetic, and the twelve assets are synthetic compositions built so every check measures real pixels; only the statutes are real (the EU AI Act's Article 50 machine-readable label obligation, enforceable August 2, 2026, among them).
The exportable batch certificate: 58.3% auto-cleared on this 12-asset demo batch, with the trust invariant stated on its face and every verdict traceable per asset.
The durable part, the reason I think this holds even as models get better, is that a flawless generator still ships assets that have to be measured against exact PMS specs and stamped with the right per-market disclosures. Generation was the part that felt hard. Governing what is safe to ship turned out to be the part that actually matters, and almost none of it is AI. If you want to see the disagreement resolve itself asset by asset, the running demo is here.
So the question I now ask myself, and I would ask you: of the AI-assisted creative your brand shipped this week, which single asset could you prove was on-brand, in a number, six months from now when someone asks?