A·W01 v37r2 plates — the four you kept, plus W05
slot — 4:5 above · 9:16 above
25 ads, 50 masters. Four different numeral faces and four different colours, each derived from the ad it sits on — not one treatment stamped fifty times.
The v41 tag used the same Poppins numeral, the same navy, and the same pink pill on every ad. I then argued consistency as the virtue, which was mostly a rationalisation for not doing the per-ad work. Meanwhile every concept has carried its own palette pair all along — ctaFill and ctaInk, the pair already chosen for that ad's furniture — and I ignored them.
Now the tag is derived from the ad:
And a bug I caused and caught: the first build of this looked worse, not better. Bodoni and Fraunces are variable fonts and I declared them without a weight range, so they fell back to their light default instance and the numerals came out thin and mis-spaced. Fixed by declaring the ranges and preloading each face before the still is captured.
Placement is computed per frame, never fixed: the product label is detected on the bare render (measure_label.py — the label, not the bottle, because a bottle-shaped box makes every gate fire and mean nothing), then the tag is placed in the first slot that clears the label, the proof roundel, the headline and the fine print — trying a gutter beside the product first, then the band above it, then the band below, shrinking the tag before it will accept a compromise.
It also picks its own ink: the background luminance under the chosen box is sampled, so the tag sets in navy on the pinks and creams and in white on the cobalt.
A new gate (offergate.py) checks every frame for presence, a 56px minimum on the numeral, and zero overlap including against the label — which no other gate looks at.
| Gate | A (10) | B (20) | C (20) |
|---|---|---|---|
| Text overflow | 0 | 0 | 0 |
| Solid blocks over size | 0 | 0 | 0 |
| Element collisions | 0 | 0 | 0 |
| Meta safe zone | 10/10 | 20/20 | 20/20 |
| Roundel over chrome | 0 | 0 | 0 |
| Offer: present / sized / clear of the label | 0 fail | 2 fail | 3 fail |
Group A is fully resolved: 10 of 10 masters, every gate at zero. That is the set to judge the design on.
On five frames the tag ends up touching the product label because those plates have no clear real estate left — the product spans the frame and the proof roundel occupies the only gutter: B·W05-916, B·W08-45, C·W06-45, C·W06-916, C·W08-45. They are outlined in amber below.
This is the third time today the same root cause has surfaced from a different direction. It stopped v35 being fixable in Remotion this morning, it put the price line on hands and reflections this afternoon, and now it leaves the offer tag nowhere to go. v35 and v36's plates run the product to the frame edge. Reshooting those under v38's pixel-band brief is the fix; nothing in the layout can solve it.
The offer gate checks the product label, the roundel, the headline and the fine print — but not faces. On B·W09 the tag lands on her cheek. It reads, but a price tag on a face is not right and I am telling you rather than letting you find it. A face-box check is the next thing to add.
No CTA anywhere. The offer maths is verified against brief/BUILD-CONTRACT.md ($28 one-time, $14 first subscription bottle, exactly 50%). The three caveats from yesterday still stand and still need your call: the $14 is the first subscription bottle, the contract forbids promising free shipping while two other documents promise it, and none of the amounts were ever read back from Shopify. Headlines in all three groups are still the inherited unqualified ones, so this is not cleared for placement.
A·W01 v37r2 plates — the four you kept, plus W05
slot — 4:5 above · 9:16 above
A·W02 v37r2 plates — the four you kept, plus W05
slot — 4:5 gutter · 9:16 gutter
A·W03 v37r2 plates — the four you kept, plus W05
slot — 4:5 gutter · 9:16 gutter
A·W04 v37r2 plates — the four you kept, plus W05
slot — 4:5 gutter · 9:16 gutter
A·W05 v37r2 plates — the four you kept, plus W05
slot — 4:5 gutter · 9:16 gutter
B·W01 v35 plates
slot — 4:5 above · 9:16 above
B·W02 v35 plates
slot — 4:5 gutter · 9:16 gutter
B·W03 v35 plates
slot — 4:5 above · 9:16 above
B·W04 v35 plates
slot — 4:5 gutter · 9:16 gutter
B·W05 v35 plates
slot — 4:5 below · 9:16 above-compromised
offer tag touches the product label on this one — no clear slot on this plate
B·W06 v35 plates
slot — 4:5 gutter · 9:16 gutter
B·W07 v35 plates
slot — 4:5 below · 9:16 below
B·W08 v35 plates
slot — 4:5 above-compromised · 9:16 above-compromised
offer tag touches the product label on this one — no clear slot on this plate
B·W09 v35 plates
slot — 4:5 above · 9:16 above
B·W10 v35 plates
slot — 4:5 gutter · 9:16 gutter
C·W01 v36 plates
slot — 4:5 above · 9:16 above
C·W02 v36 plates
slot — 4:5 above · 9:16 above
C·W03 v36 plates
slot — 4:5 gutter · 9:16 above
C·W04 v36 plates
slot — 4:5 gutter · 9:16 gutter
C·W05 v36 plates
slot — 4:5 gutter · 9:16 above
C·W06 v36 plates
slot — 4:5 above-compromised · 9:16 above-compromised
offer tag touches the product label on this one — no clear slot on this plate
C·W07 v36 plates
slot — 4:5 below · 9:16 below
C·W08 v36 plates
slot — 4:5 above-compromised · 9:16 above-compromised
offer tag touches the product label on this one — no clear slot on this plate
C·W09 v36 plates
slot — 4:5 gutter · 9:16 gutter
C·W10 v36 plates
slot — 4:5 gutter · 9:16 gutter