Creative Blueprint
BlueprintWorked exampleBefore / AfterBatch 07Batch 08 — to reviewBatch 09 — to reviewSkillsLessonsProtocols

LESSONS — anti-regression rulebook (template clone system)

How the anti-regression works

  1. One rulebook (this page = LESSONS.md): every lesson from every review, phrased for any brand, never deleted.
  2. Blocking linter (lint.py): before ANY generation, every ad spec is checked. One failure = nothing is sent. It checks banned words (Autoship, subscription, conversion, compression shirt, competitor names, age instead of problem, fake named quotes), generic capsules, raw organs, 'belly' instead of 'beer belly', missing decode fields (why / DNA / scene logic), sexual templates on the wrong engine, wrong template for the ad number (D13), powder/scoop instead of capsules (A30), dung/blood/killed animal (C14), a cow instead of a bison (C16).
  3. Mandatory decode fields per ad: why it works, template DNA, scene logic, sexual reading, angle.
  4. Engine switch: OpenAI refuses → Flux 2 Pro (kie.ai) + real jar photo and exact text composited by script. Automatic.
  5. Full-res QC against this rulebook, and each review adds new rules here first.

Every rule below came from a founder review. Each one stays active forever; every new batch must pass all of them.

Format: ID · rule · origin. The linter (`lint.py`) enforces the machine-checkable ones; the rest are on the per-ad decode checklist.

A. Decode (before writing anything)

IDRuleOrigin
A1Decode why the template works (the scroll-stop trick in one sentence).B1 review + Loom O2 (O74: "great, but I would have copied the template more" — copy its layout, framing, pose, prop cluster and colours 1:1; swap only what belongs to their product/customer)
A2Template DNA: list everything that belongs to THEIR product (material, flavor, symbol, body part, brand logo, offer, copy formula) and swap each for ours. Never import it.Loom 4 (#2 arm, #23 lab logo, #26 hair, #36 brisket, #39 chocolate)
A3SCENE LOGIC: ask why the scene is where it is (shower because hair falls in the drain; kid's bedroom because the product is for kids' sleep). If the reason doesn't apply to our product, move to the scene where OUR problem shows.Loom 7 (#70)
A4SEXUAL / INNUENDO READING: decode the hidden meaning (pineapple = vulva/taste, cake log with cream = phallus, eggplant = penis, "drain him"). Our version must be just as sexual AND tie to our angle; never sanitize it into something meaningless.Loom 7 (#57 #61 #63 #65 #69)
A5Pick the angle the template naturally carries from the research (beer belly, man boobs, wild vs farmed, tested 3, anti-waste; drive/testosterone for sexual templates). Never invent a promise.B1 / R8
A6Same angle as the template → keep their words AND their visual mechanism (the fat bottle in #58, "Let no one hit" in #63).Loom 2 #14, Loom 6 #58, Loom 7 #63
A7Every element tied to THEIR product category must be re-derived for ours — including innuendo objects (pineapple = vaginal-probiotic taste joke → for a men's product use a male equivalent: banana, glazed donut ring). Keeping their object = not adapting.Loom 8 (#61 #69)
A8Copy the template's PLACEMENT and GESTURE exactly: product held in the hand (fingers around it, not floating on a palm), on the lounger/sofa, in front of the face.Loom 8 (#57 #65 #79)
A9Split-body templates: ONE single body cut exactly in half (same skin, same shorts, same pose), fat half vs lean half meeting at the center line — the navel sits exactly on the cut (Loom 9 #77).Loom 8 (#77)
A10Reproduce the template's special text treatment (sunscreen bubbles, clay letters, handwriting) — never replace it with a flat font.Loom 8 (#65)
A11Avatar age (45-60, greying) applies to EVERY person shown as the customer, sexual scenes included.Loom 8 (#79)
A12Replace the template's setting props with props of OUR problem (beer cans, pizza, jeans that won't button, scale) — not the template's furniture (kids' beds).Loom 8 (#75)
A13THE #75 METHOD (first-try rule): before any prompt, inventory EVERY element of the template pixel by pixel (setting, each prop, each person, light, camera angle, text blocks, product spot) and mark each one KEEP or SWAP→our equivalent, with the reason. The prompt is written from this inventory. Mandatory field 'inventory'.Loom 9 (#75 'you could have done this from the first try')
A14BEER BELLY IS THE DEFAULT. When the template carries another angle (GLP-1 face, libido, sleep, energy), FUSE it with the beer belly: their mechanism + our core pain. Pure-drive ads stay allowed but must still make sense for the belly buyer.Sam Loom 1 (S2, S10 question)
A15Match the template's SHOCK level: if their image is gross/shocking (worms out of a belly), ours must be equally shocking for our problem (belly melting, bursting) — never a tame substitute.Sam Loom 1 (S7)
A16Progressions read left → right toward the result: silhouettes/profiles FACE the result (to the right).Sam Loom 1 (S8)
A17COPY THE ACTION, not just the objects: if the template POURS the product into the drink he already has, ours pours the product into his beer (S18). The verb of the scene is part of the winner.Sam Loom 2
A18Scene moves must stay ON the benefit: only move the scene to where OUR problem is DIRECTLY visible (belly in the mirror, belly on the scale), never to an indirect consequence (shoelaces) that could sell another product (S15). The headline keeps the template's formula with our blunt benefit ("Smoother poops" → "Flatter belly").Sam Loom 2
A19When unsure whether the template's angle is ours, read the line AS OUR CUSTOMER: if it already works for him ("Lost my waistline — last seen 3 weeks ago" = he got slim), copy it word for word (S14). Flipping a line that already works = fail.Sam Loom 2
A20When the reviewer validates one try, that try is FROZEN: never regenerate it; a redo only changes what he named (S18 keep try-1 idea, S58/S79 keep try 1). Pass the validated try as tpl_abs.Sam Loom 3
A21Copy the template's core visual trick literally: if the woman's face IS the product, our jar IS her face, in the same painted style (S11 — I made it photoreal with a jar on her head).Sam Loom 3
A22"Change only the wording" = keep layout, type and style pixel-for-pixel; use the liked try as the template (S29).Sam Loom 3
A23A before/after template stays a before/after: one problem state vs one solved state, never two solved states (S74). Fruit/object metaphors map to the belly (bloated pear vs slim pear, S50).Sam Loom 3
A24Every headline and bubble names the beer belly explicitly; anything that could read as hangover, brain or a generic win is off-angle (S42 S52 S56 S80). Swapping to the woman angle = her desire tied to his beer belly (S57).Sam Loom 3
A25Before re-prompting a failed ad, work out HOW the template was made and use the same method. S11 was a real photo with the product pasted on as her head (a simple composite), and I failed 3 times by regenerating the whole scene. The fix: (1) Seedream edits the template itself with the smallest change: age the man, clear the text, nothing else; (2) `jarswap.py` swaps only their jar for ours with a masked gpt-image-2 edit (no hands, no hair); (3) the text is added by script. Keep the template's aspect ratio (9:16 stays 9:16; `kie_gen.py --aspect portrait_16_9`).Sam Loom 4
A26His latest verdict wins, even on a try he rejected earlier (S42 try 1 was validated in Loom 4): record it in sell_override.json and never touch it again.Sam Loom 4
A27A twist must make literal sense for OUR problem: a pun/twist built for their product ("size doesn't matter, thickness does" = penis) must be re-built so it is literally true for the beer belly ("Size doesn't matter… unless it's your beer belly!").Loom 2 #11, Loom 3 (B3 preferred), reused as S77 first try [added from Loom audit, 2026-10-02]
A28The villain is the research mechanism; the product is its killer: when the template has an enemy (a hormone, a deficiency, a habit), the enemy becomes estrogen (beer belly = estrogen), and Wildhorn is what beats it. Keep the template's sentence, swap symptom → beer belly / man boobs and cause → estrogen.Loom 3 #21 #24, Loom 4 #23, S52, S70 [added from Loom audit, 2026-10-02]
A29When their image mechanism can't apply to our product, keep the IDEA with our own mechanism: colostrum can be milked, organs can't. Keep "from the source straight into the jar" but show it our way (rancher's board of tagged organs + a living bison).Loom 4 #37, Loom 5 (B5) [added from Loom audit, 2026-10-02]
A30Our product is CAPSULES — never powder, liquid or a scoop: Wildhorn = 2 capsules a day. When the template shows its consumption ritual (powder into coffee, scoop, shot), translate it into capsules; the drink in the scene stays the drink HE already has (beer), poured as beer. Lint blocks powder/scoop wording.Sam Loom 3 (S18 R3), Sam Loom 4 [added from Loom audit, 2026-10-02]
A31A template already on one of our core angles keeps ONLY that angle: if the template highlights man boobs, ours highlights only the man boobs; A14 beer-belly fusion never overrides A6 (same angle → copy).Sam Loom 3 (S79 try 2) [added from Loom audit, 2026-10-02]
A32The staging acts out the line: people and gestures perform what the headline says (she initiates → she is on top). Check pose and roles against the text before generating.Sam Loom 3 S55 [09:16] [added from skill audit, 2026-10-02]
A33Favor the most aggressive angles (beer belly, man boobs); ration the soft 'supplements failed you' angle.Loom 1 + protocol 2 [added from skill audit, 2026-10-02]
A34Keep the template's term when OUR avatar uses it about himself ("dad bod", "gut", "man boobs"): A19 wins over the beer-belly default (B2/A24) for that one term — O08 headline stays "Why You Can't Lose Your Dad Bod", the rest of the copy is unchanged. Spec flag `template_term` tells the linter.Oct08 Loom (O08)
A35The ad's angle is ONLY beer belly, libido or man boobs. Secondary benefits (sleep, focus, recovery, joints, energy) never carry an ad — not the headline, not the quote, not the scene/pose. When the template sells one of those (better sleep, stiff joints), swap it for the beer belly (default) and change the scene/pose so it SHOWS the beer belly (O47: a squat = a joints pose → belly hanging over the belt, out of breath). Lint warns on 'sleep' in the copy.Loom O2 (O47 O60 O71 O72 O99: "I don't want a better sleep angle", "make it more about beer belly")

B. Copy

IDRuleOrigin
B1Same amount of text as the template. No added context line, tagline or disclaimer.Loom 1
B2Name the customer's problem, not an age ("For stubborn beer belly", not "For men over 40"). Say "beer belly", not just "belly".Loom 1 #7, Loom 7 #68
B3Benefits = the result he wants vs what he already tried; never product features.Loom 1 #3
B4No mechanism jargon ("conversion", "aromatase").Loom 1 #11
B5Clear rival product + clear everyday problem ("3 fat burners a day just to button my jeans").Loom 4 #38
B6Every line must say what it's about in one read. Add a timeline ONLY if the template has one — never invent a deadline (B8 #65 added 'in 21 days': wrong) ("shirt off since day 21" failed: off for what?).Loom 7 #65
B7Never mention Autoship / subscription.Loom 6 #51
B8Avatar hides by sucking in, baggy shirts, shirt on at the pool, endless diets — not compression shirts.Loom 6 #54
B9Proof object = something he's proud to see (old jeans fit), not a technical detail ("1 notch").Loom 5 #44
B10Aggression = precision on his deepest pain (bedroom lights on). Not aggressive enough = fail.Loom 6 #47, Loom 7 #62
B11Concede the pleasure, attack its consequence ("Beer is fun. Beer belly isn't.").Loom 3 #22
B12Template is a signed customer review → keep the format with a first name + initial (Adrien's decision, Loom 8 #79). Never add a signature the template doesn't have.Loom 8
B13Same text amount = nothing added at all, not even a small 'tie-in' line (B8 #57 added one: wrong).Loom 8
B14Stranger test: a man who has never heard of the brand must understand WHAT it is and WHAT it does on the first read (S9 'You can't farm this' was too abstract → name the thing: wild bison organs + beer belly).Sam Loom 1
B15Simplest words win: if a plainer phrase exists, use it ("see your belt buckle again" → "a flat belly again") (S29).Sam Loom 2
B16Stats are BENEFIT claims phrased like the template ("92% reported clearer minds" → "93% saw their beer belly shrink*"), with the survey footnote (S24).Sam Loom 2
B17Known-reference swap: their famous rival → the one OUR avatar already knows. Minoxidil, Ozempic, coffee, edibles → T-boosters, fat burners, GLP-1 shots, beer. Change only that word.Loom 2 #19, Loom 3 #25, #4, S42, S47 [added from Loom audit, 2026-10-02]
B18A "your X routine" line names a routine he has BECAUSE of the problem ("belly-fat routine" doesn't exist; "Your hide-the-chest routine may be letting you down" = amazing).Loom 2, Loom 3, Loom 4 (#8) [added from Loom audit, 2026-10-02]
B19Keep the transformation about HIS body, in his words: "turkey neck → swan neck" is the customer's body; ours: "FROM 'DAD BOD' TO 'BISON BOD'". Use the phrase he says about himself; never turn it into a product problem ("from farmed to wild").Loom 1, Loom 3, Loom 4 (#29) [added from Loom audit, 2026-10-02]
B20Real facts only: offer, price, guarantee and proof numbers come from the brand facts; never invent a price, bonus, timeframe or statistic; if the template has a stat we don't have, keep the voice and drop the number; say each fact once.Loom 5 #41–#49 + S55 + c0232 [added from skill audit, 2026-10-02]
B21Censor the word for Meta: always write S*X (S*x in sentence case) in every ad text — headline, bubble, whiteboard, button, everywhere, also in copy.json. Lint blocks the plain word (case-insensitive) with "write S*X".Oct08 Loom (O04)
B22Never the word "drive" in Wildhorn copy — not "drive", not "S*X drive", not "drive is back": it is too far from his angle. Say "libido" ("stamina" may sit next to it), or go to the beer belly / fat angle. Minimal swap, rest of the ad untouched: "MORE DRIVE" → "MORE LIBIDO", "BOOST YOUR DRIVE & STAMINA" → "BOOST YOUR LIBIDO & STAMINA"; a pure-libido template headline goes to testosterone ("The drive is back" → "The testosterone is back", his words). Lint blocks the word in any quoted copy (texts + composite).Loom O1 (O15 O23 O30, 08/10)

C. Visual

IDRuleOrigin
C1The image must SHOW the avatar's problem or result.Loom 2 #6
C2ORGANS, ORGANS, ORGANS — every ingredient visual shows recognizable organ SILHOUETTES (heart, lobed liver, bean-shaped kidney, oval testicle), FRESH and APPETIZING like a premium butcher counter (deep red, clean, smooth, glossy: you want to eat them). Never brown/dried-looking (S17 brown organs looked like dung), never shapeless meat chunks, never gross: NO visible veins or arteries, no blood, no wet dripping surfaces (Loom 9 #70). If the template shows organs, copy their rendering exactly. Make the invisible visible: transparent capsules packed with small whole organ silhouettes, or labelled organs. Never a generic capsule. History: B7 QC once asked for a freeze-dried rendering; Sam Loom 2 (S17) overruled it and the latest verdict wins (A26). The product itself IS freeze-dried, but that is a copy fact, never a rendering instruction.Loom 4 #40, Loom 5 #39, B7 QC, Sam Loom 2 (S17), Loom 9 #70 (reconciled 2026-10-02)
C3Keep what made the template a winner AND make it clear (billboard MADE OF real organs + labels).Loom 6 #35
C4Follow the example's visual code (orange glow on the result too).Loom 4 #16
C5Keep the template's render style and our avatar (45+ man), not their person — and remove every leftover of their props (cowboy holding THEIR bottle, Barbie sequin skirts on our Ken).+ Sam QC round 3
C6Jar = exact replica, real proportions, never squashed, never covering the hero visual.Loom 3 #16, B3 QC #22
C7Template has no product → add none. Brand logo slot → Adrien's official logo file pasted by script (D19) — never a product photo, never a logo drawn by the model.Loom 3 #23, B5 QC #35, Loom O1
C8When asked for "another version", change the idea, not the wording.Loom 5 #47
C9Text placement QC: same spacing between headline and secondary text as the template (Loom 9 #73: small text glued to the headline). text centered on the template's anchor (e.g. the eggplant's axis), same position/size as the template.Loom 8 (#73)
C10Product rendering quality = the template's: real 3D object on the surface with contact shadow and matching light, and the template's text texture (Loom 9 #65).Loom 9
C11Hands holding objects: fingers wrapped naturally around the phone/jar, object fully visible and upright — check at full res (S33).Sam Loom 2
C12Before/after difference obvious at first glance: concrete cues (belt holes, shirt tucked, belly profile) so the change reads in one second.Loom 2 (#13) [added from Loom audit, 2026-10-02]
C13Never redraw an illustration that worked: same side, same framing, complete body (no amputated arm, no flipped side).Loom 3 (#2) [added from Loom audit, 2026-10-02]
C14Nothing ambiguous: no killed animal, no dung, no powder pile, no blood. The bison is always alive and proud.Loom 4 #37 #35, Sam Loom 2 (S17) [added from Loom audit, 2026-10-02]
C15Format test: the format itself reveals what the product is made of in one second (capsule wall failed → butcher-chart bison / slab of tagged organs).Loom 5 (#35) [added from Loom audit, 2026-10-02]
C16The bison must read as a bison: hump, dark shaggy fur, short curved horns; "a wild American bison, NOT a cow, no spots".Loom 5 (#38), QC B4 #38 [added from Loom audit, 2026-10-02]
C17Product size = the template's product size. Composite `jar.h` must match the template's product height.Loom 9 (#57) [added from Loom audit, 2026-10-02]
C18Before = maximum pain, after = maximum reward: the problem image is the most aggressive version (huge beer belly, arm visible, belly pushing toward the result); the result image is the most colourful, rewarding one.Sam Loom 2 (S8), Loom 3 (#16) [added from Loom audit, 2026-10-02]
C19An ad that sells a transformation never shows a man who already has the result: our avatar is an ordinary 45-60 greying man with a dad body (soft, slight belly OK), not fit/ripped like the template's model. Any held jar gets a real grip (C11): fingers wrapped round its sides, thumbs on the glass edges, label facing camera, its weight in his hands — never floating between the hands.Oct08 Loom (O02)
C20Brand colours, never pink: every ad is recoloured to the Wildhorn palette (ad kit: burnt orange #E0662C, cream #F2E6D0, near-black #0F0C0A, plus the jar's amber/black) — keep the layout, swap only the colours. A pink/female-coded template (pink bars, badges, stars, brackets, banners, CTA) is ALWAYS recoloured, even when it is a winner; pink only if the ad itself targets women. Lint blocks 'pink'/'magenta' in the visual prompt (exempt: renders made before the rule).Loom O2 (O29 O62 O85 O88: "try to put the colour of the brand — that's one thing you do bad", "stop with the pink, pink is for girls")
C21Settings and props are masculine — they belong to our avatar (45-60 married man): never a girl's bedroom (pink bedding, cushions, vanity products), never feminine or 'cute' seasonal decor (pink or decorative pumpkins). Swap them for a neutral masculine equivalent (dark wood, plain navy/charcoal bedding, garage, kitchen counter, beer bottles, leather).Loom O2 (O96 "change the room, it's not a girl", O64 "change the pumpkin behind")
C22Our product must look as REAL as the template's: when the generated jar looks CG/flat next to their photographed product, paste the real kit cutout (`/srv/blueprint/kit/files/wildhorn-jar-cutout.png`) by script — right size and perspective, scene-matched grade and rim light, contact shadow and ground occlusion — and QC it side by side with the template's product at full res. Extends C10.Loom O2 (O84: "put the product more realistically — compared to theirs it's shit")

D. Production

IDRuleOrigin
D1When OpenAI refuses (sexual), switch engine (Flux 2 Pro via kie.ai) and COMPOSITE the real jar photo + exact small text by script. Never water the ad down to get past a filter.Loom 7 #62
D2QC every image at full resolution against this file before showing it.B1
D3Review page = only ads to review; show template + first version (B1) + new version.Loom 4, Loom 6
D4Every review: log what worked and WHY, what failed + root cause + new rule, here first.Loom 3–7
D5Engine chain by need: OpenAI first (accepts suggestive food objects: banana, glazed donut) → Nano Banana Pro via kie.ai for text that must be PAINTED INTO the scene (sunscreen letters: perfect spelling) → Seedream for scenes with skin/lingerie (render with no text) → composite the real jar + exact text.B9 (#65 #69 #79)
D6FALLBACK PARITY: when an ad falls back to another engine + composite, re-check EVERY inventory line — every KEEP placement (jar on her head AND bottom right) must exist in the composite spec. The fallback dropped the head jar on S11 silently. Lint now checks that composite jar count = placement count.Sam Loom 2
D7Seedream must NEVER render a full ad (it garbles labels and writes prompt words like 'crossed' on the image). Seedream = scene only, no text, no product; jar + text always composited by script. Engine 'seedream_full' is banned in lint.Sam QC round 3 (S58 S74 S79)
D8The image model never draws a standalone brand mark outside the jar label (GPT wrote 'WILLDHORN' on 4 ads in one round: S8 S18 S35 S43; its 'horn icon' came out as horns on a W in Oct08 batch 2). The prompt leaves the logo spot EMPTY and the official logo file is pasted by script (D19). Lint blocks any text line that is a bare 'WILDHORN' wordmark.Sam QC round 3 + Loom O1 (08/10)
D9Emojis never go in composited text (font renders boxes) — keep them only when the image model draws them.Sam QC round 3
D10'OK' means a NEW file exists on disk. The pipeline checks the template path before generating and counts output files after; a crash (wrong template extension) once reported 'OK' 3 times with no image (S42).Sam Loom 3 redo
D11Every correction generalizes: a fix Adrien dictates on one ad becomes a rule applied to every future ad, not a one-off patch.Loom 2 #17, Loom 4 #40, Sam Loom 2 (S24) [added from Loom audit, 2026-10-02]
D12Review cadence: each round = redo every rejected ad + the next 10 new templates.Loom 2, Loom 3, Sam batch [added from Loom audit, 2026-10-02]
D13Template path sanity: the spec's `tpl` must equal the template at that S-number (canonical map `sam-batch/canonical_templates.json` = sorted(templates)[num-1]); a redo with `tpl_abs` must point to `out/s_NN_v*.png` with the SAME NN. Lint blocks any mismatch. The 2026-10-02 audit found S29 R3, S33 R3, S35 R3, S55 QC, S79 QC, S80 R4 pointing at another ad's template (S29 try 3 "changed the style" because it was generated from S31's Zapply template).2026-10-02 audit [added from audit]
D14What Adrien says in the Loom wins ("keep the B8" = keep the B8). Only when in doubt: the LATEST version overall. The final version of every ad comes from ONE validated mapping file (ad → exact file + Loom quote), never from "latest file" or a per-round meta file. Every review round must be in it; an ad with no validation evidence is removed, not kept. Exports and campaign packs are built only from that file, replaced in place, never re-sortedCampaign packs audit 04/10: round 9 was skipped (no meta.json), so 9 ads showed rejected B8 versions (57, 61 banana, 65, 79 older man…), 2 never-validated ads (69, 73) were live, and S-08 showed an unreviewed try [added 2026-10-04]
D15Output format, every ad: width 1080. Square template → 1080×1080; Story/TikTok 9:16 → 1080×1920 (stays a Story); 4:5 → 1080×1350; any other ratio → the template's ratio at 1080 wide. Crop from the 2K master, never regenerate for size. Enforced by `adformat.py` (orun.py, ocomp.py, skill srun.py/composite.py).Oct08 Loom
D16SUPERSEDED by D20 (Loom O1): our ad big on top with the template small underneath was rejected — template and our ad now sit side by side at the same size.Oct08 Loom
D17After every generation, any brand mark OUTSIDE the label (corner logo, badge, sign, receipt, banana sticker) is erased and replaced by script with the OFFICIAL logo file (D19), never left as the model drew it; QC zooms on every mark at full res. Until 08/10 the kit horn-icon SVG was pasted instead: Adrien rejected it in Loom O1 ("the W with the horns is not great… put my logo").Oct08 batch 2 (13 of 89 ads had W+horns) + Loom O1 [added 2026-10-08, updated 2026-10-08 Loom O1]
D18kie gpt-image-2 refuses 4:5 and returns 3:4, so the 4:5 ad is a ~6 % top + ~6 % bottom crop of the render: tell the model to keep a plain safe strip top and bottom (no text/band/product there), and if the least-content crop still cuts a headline or a bottom band, REFIT (re-crop with a chosen window, or rebuild the band by script) — never ship a blind crop. QC checks both edges of every 4:5.Oct08 batch 2: O13 O16 O96 lost a headline / offer line / bubble to the crop [added 2026-10-08, lead decision]
D19The brand mark is Adrien's REAL logo, pasted by script: the official file from the ad kit (`/srv/blueprint/kit/files/wildhorn-logo-white.png` on dark backgrounds, `wildhorn-logo-black.png` on light ones = the WILDHORN wordmark with the horns on the W), in the template's logo slot (same position, about the width of their logo, never upscaled past the file's native ~440-484 px), tilted with the surface when the slot is tilted (receipt). The model never draws it: no AI W-with-horns, no generic horn icon. Erase the old mark first (inpaint on texture, row-patch on smooth backgrounds, texture clone on hair/skin) and zoom at full res for leftovers. Tool: `oct08/o2logo.py` (0 credits).Loom O1 [02:52] "I don't know why you're not putting my logo… the W with the horns is not great" — applied to 20 ads (O33 O36 O39 O41 O43 O51 O56 O59 O66 O69 O71 O77 O80 O81 O83 O84 O90 O91 O93 O95)
D20Review page = template and our ad SIDE BY SIDE at the SAME size (~420 px each on desktop so the row fits one screen; stacked full width on a phone), ads in strict number order (never grouped by angle), and nothing else in the row: a big readable ID ("O15" — not a font where O looks like 0), "Template" | "Try N" labels, and his Loom note on redos. Redo = the new try next to the previous tries, same size, newest first. No QC verdicts, tables or copy dumps on the page. Image-perf rules stay (first image eager + fetchpriority high + preload, the rest lazy + async, webp q80 at 2x, width/height set). Replaces D16.Loom O1 [03:05] "put the image same size like the template, what is this mess… why QC pass… a tableau in the middle"
D21A Nano Banana text edit re-draws the WHOLE image and garbles small text it was not asked to touch (the jar label on 6 of 12 'drive' edits: O15 O60 O68 O70 O82 O86). After every text edit, keep the base try pixel-for-pixel and take ONLY the changed text boxes from the edit (`oct08/o2merge.py`; boxes with ≥10 px plain margin around the line, or the old letters ghost through); QC the label at full res.Loom O1 redo round (08/10, lead)
D22Every template collection and every batch goes through `tpl-dedup` (global registry `/root/workspace/wh-remix/template_registry.jsonl`): an image is kept only if `tpl-dedup check` says NEW (no same source ad id, phash/dhash/center-crop phash all > 8 vs every entry), then registered with `tpl-dedup add --brand --source --used-in`. An ad already in the registry is never collected or cloned again.Founder order 10/10 (library rebuild: same ad returning across pages, batches and collections)

E. What worked (repeat it)

IDRuleOrigin
E5Sam round 1: 6/10 validated first try (S1 S3 S4 S5 S6 S10) thanks to the pixel inventory + flip of their object for our angle (bananas → shrinking belts, puzzle jar of organs, estrogen signs, text-only via script).Sam Loom 1
E4#75 B9 / #72 B9 / #79 B9: every pixel of the template scene inventoried, then only what belongs to their customer swapped for ours (game night props, tired dad, older man).Loom 9
E1#63 'Step 1 Lose the beer belly / Step 2 Let no one hit': kept both template lines word for word except the subject, kept the SOCIAL mechanism (everyone wants you, your partner guards you). Only swapped who transformed.Loom 8
E2#62 / #78 / #72: exact copy when the template already speaks our angle; real jar composited; symbol swap (hair → tape).Loom 8
E3#70 B7 capsule packed with small whole organs = the reference organ visual.Loom 8
E6S23 moon = found an object with the SAME SHAPE as our problem (round moon ↔ round beer belly) so the template's visual pun survives intact. Look for shape/function equivalents first.Sam Loom 2
E7S16 / S20 / S21 / S22 / S27 / S32 / S36-S38: exact structure + one-word angle swap + our proof props = validated first try (26/34 in round 2).Sam Loom 2
E8#9 wojak vs chad: each line is a concrete, brutally specific scene from HIS life with a beer belly (sucks in his gut for photos, wife stopped grabbing his waist, shirt on at the pool) vs the proud mirror scenes. "Exceptional."Loom 2 [added from Loom audit, 2026-10-02]
E9#21: same words, same gag, two nouns changed (symptom → beer belly, cause → estrogen; the product hangs from the belt buckle like it hung from the chin hair).Loom 3 [added from Loom audit, 2026-10-02]
E10#25: minimal change, maximum fidelity — everything identical, ONE word swapped for a rival he knows. "Apply it everywhere."Loom 3 [added from Loom audit, 2026-10-02]
E11#39 B6: the template's mechanism (product pours into the container) kept 1:1 but filled with OUR literal content in recognizable form (tagged heart, liver, kidney, testicle). "Exactly what I was thinking."Loom 6 [added from Loom audit, 2026-10-02]
E12Deep in the avatar: #8 B4 hide-the-chest routine ("amazing"), #44 B6 old jeans ("better than the example"), #47 B6 lights on ("the greatest"), #30 B4 "she notices first". Routine, proof and shame are HIS, not generic.Loom 4, Loom 6 [added from Loom audit, 2026-10-02]
E13Fusion without breaking the format: S28 arcade kept their whole UI and added one row "BELLY FAT"; S67 "really good understanding of the joke" (This sh*t is wild).Sam Loom 2, Sam Loom 3 [added from Loom audit, 2026-10-02]