Creative Blueprint
BlueprintWorked exampleBefore / AfterSam batch — finalAll adsSkillsLessonsProtocols

← Both skills · wildhorn-static-ads · wildhorn/PLAYBOOK.md

wildhorn-static-ads · files
wildhorn-static-ads/wildhorn/PLAYBOOK.md · 304 lines
Everything to run a Wildhorn batch: brand snapshot, non-negotiables, the batch end to end, engine decision tree, what Adrien expects, known traps.
Download the whole skill (zip)

Wildhorn static ads — the protocol, the feedback loop, everything Adrien taught

This playbook turns any winning static ad template (any brand, any niche) into a Wildhorn ad that Adrien validates on the first try. It is the Wildhorn layer of this skill, on top of its generic folders:

This skill alone is enough to run a Wildhorn batch. The wildhorn/ folder holds the Wildhorn depth:

Reference Read it when
wildhorn/brand.md writing any copy or prompt: product facts, label, offer, proof, avatar, banned words, assets, fonts/colours
wildhorn/angles.md choosing the angle and headline: every angle, mechanism, every validated headline, and the lines that failed
wildhorn/lessons-wildhorn.md before every spec and every QC: the full rulebook with evidence (A1–A33, B1–B20, C1–C18, D1–D13, E1–E13)
wildhorn/adrien-feedback.md before a review, and when ingesting a Loom: chronological digest of all 12 Looms, the 261-row coverage matrix, how Adrien reviews
wildhorn/winners-catalogue.md before cloning: find a validated ad with the same template brand/format and reuse its pattern (83 Sam + 79 run 1)
wildhorn/failures-catalogue.md before sending a spec: every rejected try grouped by failure type + a 12-point pre-flight checklist
wildhorn/paths-and-commands.md to run anything: VPS paths, scripts, pages, exports, checkpoint, copy-paste commands

Track record. Run 1 (79 templates, research-first method): 0 % first try, 261 generations, 9 review rounds. Sam batch (83 templates, decode + pixel inventory + lint): 71 % first try (59/83), 100 % final (83/83), 133 calls. 162 validated ads live at https://blueprint.machineroom.app/all-ads. The difference is the method below — follow it to the letter.


0. Working rules for Wildhorn

  • All work on the VPS (ssh vps-claude, workshop /root/workspace/wh-remix/). Mac = only ~/Downloads exports and temp files for viewing images. Never run Chromium/Playwright on the Mac.
  • English for everything in this system: specs, prompts, pages, briefs, replies about it (Adrien's rule, 01/10).
  • Copy, angle choice, decode and visual QC happen in the main context — never delegated to a subagent (Adrien's rule: a summary loses the nuance). Subagents may do mechanical work: copying files, running builders, counting stats, transcribing.
  • Adrien is non-technical. He never types commands. He gives: templates (zip / iCloud / Downloads folder), a Loom per review, short verbal verdicts. You give: a review link, a short recap, and a final demand → status table.
  • Read the checkpoint first: ~/.claude/bin/checkpoint wildhorn-batch-test. Write it at the end of each round.
  • Never touch a validated try (A20). His latest verdict wins (A26).

Quick start — "here are new templates, make Wildhorn ads"

  1. ~/.claude/bin/checkpoint wildhorn-batch-test — where we left off.
  2. Read wildhorn/lessons-wildhorn.md (all rules) and skim wildhorn/failures-catalogue.md §checklist.
  3. Stage the templates on the VPS, sorted; view each at full resolution.
  4. Search wildhorn/winners-catalogue.md for the same template brand/format.
  5. Write 10 specs (decode → inventory → texts) in the main context.
  6. lint.py + D13 template check → fix until clean.
  7. Generate in parallel with srun.py; QC every image at full res; fix before showing.
  8. Build the review page (only ads to review) and send Adrien one link.
  9. Loom → transcript → coverage matrix → new rules first → verdicts (validated.json, sell_override.json) → redos + next 10.
  10. Close: final pages, ~/Downloads/Wildhorn-<Batch>/, stats, kit/creatives.jsonl, checkpoint, recap table.

1. Brand snapshot (details: wildhorn/brand.md)

  • Product: WILDHORN — Wild American Bison. Freeze-dried wild bison organs: liver, heart, kidney, testicle (4 wild organs, 0 herbs, no fillers, no stimulants). 2 capsules a day. Jar of 30 capsules.
  • Jar/label (never redesign): amber glass, matte black lid, cream label — horn logo + WILDHORN · WILD AMERICAN BISON · bison illustration · Untamed Bison Nutrition · black band NATURAL TESTOSTERONE SUPPORT* / 30 CAPSULES.
  • Assets: product photo /root/workspace/wh-remix/product-jar.jpg (Image 1 of every generation); jar cutout /srv/wildhorn-lp/p6/jar-30.webp (composited, never regenerated).
  • Offer on ads (locked): $49.95, ~~$100~~ · Buy 1 Get 1 FREE · 60-day money-back guarantee. "50% off for life" OK. Never "Autoship"/"subscription".
  • Proof: 50,000+ men · 4.8 stars · "93% saw their beer belly shrink" + "Based on a 12-week customer survey".
  • Mechanism (plain words): after 40 his testosterone turns into estrogen; estrogen stores fat on the belly and chest. Never "conversion", "aromatase".
  • Avatar: American man 45–60, greying, beer belly (default) / man boobs; hides by sucking in, baggy shirts, shirt on at the pool, endless diets; wants old jeans to fit, shirt tucked in, his wife's desire back; loves beer and game day; has tried fat burners, T-boosters, diets.
  • Angles (priority): A1 beer belly (default, always named "beer belly") → A2 man boobs → drive/sexual (her desire tied to his beer belly) → wild vs farmed → tested-3 → anti-waste (sparingly).
  • Logo outside the label = the official kit logo pasted by script, never drawn by the model (D8, D19).

2. The 30 non-negotiables (every spec, every image)

Decode

  1. Write why the template works in one sentence before anything (A1).
  2. Template DNA: list everything that belongs to THEIR product — material, flavour, symbol, body part, logo, offer, copy formula — and swap each for ours (A2, A7). Pineapple, chocolate, hair, brisket, powder, their lab logo = instant rejection.
  3. Scene logic: why is the scene here? If the reason is their product's, move to where OUR problem is directly visible — mirror, scale, jeans button — never an indirect consequence (A3, A18).
  4. Sexual reading: decode the innuendo and keep it just as sexual, tied to our angle; the visual must carry the same meaning as the text (A4).
  5. Pixel inventory (the #75 method): every element of the template marked KEEP or SWAP→ours with the reason, ≥5 lines. The prompt is written from it (A13). This is what moved first-try from 0 % to 71 %.
  6. Beer belly is the default: fuse any other template angle with the beer belly (A14) — EXCEPT when the template already sells man boobs: then only man boobs (A31).
  7. Same angle as the template → copy their words, their visual mechanism and their ACTION (A6, A17). Read their line as our customer before touching it; if it works for him, copy it word for word (A19).
  8. Copy the core visual trick literally, in the same render style (A21, C5). Pixar stays Pixar, painting stays painting.
  9. Copy placement, gesture, pose and product size — held in the hand, on the lounger, in front of the face, who's on top (A8, C17).
  10. Match the template's shock and aggression level (A15, B10). Tame = fail.
  11. A twist must make literal sense for the beer belly (A27); objects map to the belly's shape (moon ↔ belly, pear) (E6, A23).
  12. Our product is capsules — never powder, liquid or scoop (A30).

Copy

  1. Same amount of text as the template — nothing added: no context line, tagline, disclaimer, signature, deadline (B1, B13, B6).
  2. Say "beer belly" in every headline and bubble; never "belly" alone, never an age ("men over 40") (B2, A24).
  3. Stranger test + simplest words: a man who never heard of Wildhorn gets WHAT it is and WHAT it does on one read (B14, B15). "My customer is not that smart."
  4. Results he wants vs what he already tried — never features, never jargon (B3, B4).
  5. Clear rival + clear everyday problem; swap their famous reference for the one he knows (fat burners, T-boosters, GLP-1, beer) (B5, B17).
  6. His real shame and proud proof: sucking it in, shirt on at the pool, lights off; old jeans, shirt tucked, feet on the scale (B8, B9, B18, B19). No compression shirts.
  7. Stats are benefit claims with the survey footnote (B16). No invented stats, gifts, deadlines.
  8. Offer words: $49.95 / ~~$100~~ / Buy 1 Get 1 Free / 60-day guarantee. Never Autoship/subscription, never competitor names (B7, brand.md).
  9. Signed-review template → first name + initial (B12); otherwise no named quotes.

Visual

  1. Show the problem or the result in the image, obvious before/after (C1, C12, A23); before = maximum pain, after = maximum reward (C18).
  2. ORGANS, ORGANS, ORGANS: recognizable heart / lobed liver / bean kidney / oval testicle, fresh, deep red, clean, appetizing — never generic capsules, meat chunks, brown, veins or blood; transparent capsules packed with small whole organs (C2, E3, C14).
  3. Our avatar everywhere: 45–60, greying — sexual scenes included (A11).
  4. Jar = exact replica, real proportions, 3D with contact shadow, never squashed, never covering the hero (C6, C10). No product in template → none in ours (C7).
  5. Text placement = the template's: same spacing, same anchor, same treatment (sunscreen bubbles, clay, marker) (C9, A10).

Production

  1. Lint must pass before any generation (lint.py, blocking) and the template path must match the S-number (D13).
  2. Engine chain: OpenAI gpt-image-2 → refused/sexual: Seedream scene (no text, no product) or Flux + composite.py with the real jar and exact text; Nano Banana Pro for text painted into the scene. Never water an ad down to pass a filter (D1, D5, D7). Fallback must keep every placement (D6).
  3. Hard templates: copy THEIR production method (edit their image minimally + jarswap.py + script text, keep aspect ratio) before re-prompting (A25).
  4. QC every image at full resolution against the rulebook before Adrien sees it; "OK" only if a new file exists (D2, D10). Every review → feedback loop written FIRST (what worked + why, what failed + root cause + new rule), and every correction generalizes (D4, D11).

3. How to run a Wildhorn batch, end to end

Cadence: 10 ads per round (D12). Each round = redo every rejected ad + the next 10 templates. Adrien reviews each round with a Loom.

Step 1 — Receive and stage the templates

  1. Adrien sends templates (zip in ~/Downloads, iCloud BUSINESS/WILDHORN CONCEPTS/, or images in chat — if pasted in chat you don't have the file: ask for the file or describe the layout carefully).
  2. Create the batch workshop on the VPS, e.g. /root/workspace/wh-remix/batch3/ with templates/ prompts/ logs/ sell/ validated/ (or keep extending sam-batch/ with s5specs.py, s6specs.py… if he says "continue the Sam batch").
  3. Copy templates: scp -r "<folder>"/* vps-claude:/root/workspace/wh-remix/batch3/templates/. Keep original names. Numbering = position in the sorted folder — state it on the review page.
  4. Look at every template at FULL resolution (copy to a local temp dir and Read it; never a thumbnail).
  5. Check kit/creatives.jsonl and wildhorn/winners-catalogue.md: same template already done? Same brand/format? Reuse what won (S70, S75, S77, S78 were first-try reuses of run-1 winners).

Step 2 — Decode and write the spec (main context, one template at a time)

For each template, before writing any copy:

  1. Why (A1): the scroll-stop trick in one sentence.
  2. Angle (A5/A14/A31/A6): which of our angles the template naturally carries. Same buyer (Primal Viking, Mars Men, Primal Edge…) → probably ours → copy.
  3. DNA (A2/A7): every element of THEIR product world → our swap.
  4. Scene (A3/A18): why it's set there; keep or move to where the beer belly shows.
  5. Sexual reading (A4): what the object/line really means; our equally sexual equivalent tied to the belly.
  6. Inventory (A13): pixel by pixel, KEEP / SWAP with reason.
  7. Placement (A8): exactly where/how the product sits; how many jars.
  8. Texts: one entry per template text slot, same count, our words (copy theirs if same angle). Mark template_has_deadline=True only if it has one.
  9. Engine: openai with fallback="seedream_comp" by default; sexual/skin → sexual=True + seedream_comp with sd_prompt + composite; text-only → pure_comp; painted text → nano via kie_gen.py.

Spec format (Python dict in sNspecs.py, list S):

OLD = "a man in his late 40s with short greying hair and light grey stubble"
CAPS = "transparent capsules packed with small recognizable deep-red organ silhouettes (mini hearts, mini kidneys, mini livers), clean, no visible veins"
HORN = " Any brand mark outside the jar label is the horn icon ONLY (two curved horns), NO letters."
S = [
dict(num=84, tpl="10-03_c0201_Brand.png", angle="A1 Beer belly (same angle — copy)",
 why="<the scroll-stop trick in one sentence>",
 dna="<their product, symbols, body part, logo, offer, formula> → <our swaps>",
 scene="<why the scene is here> — applies / moved to <where the beer belly shows>",
 placement="<exactly where the jar is, how it is held, how many jars>",
 inventory=["KEEP …", "KEEP …", "SWAP their pouch → WILDHORN jar …", "SWAP their model → " + OLD, "KEEP headline block top-left, same spacing"],
 visual="<full visual description written from the inventory>" + HORN,
 texts=["Headline: \"BEER BELLY?\"", "Subline: \"…\""],
 engine="openai", fallback="seedream_comp",
 # sexual=True, sd_prompt="<scene only, no text, no product, empty zones for text>",
 # composite={"jar": {"x": 0.8, "y": 0.95, "h": 0.32}, "texts": [{"y": 0.06, "size": 0.08, "font": "Anton", "runs": [["BEER BELLY?", "#FFFFFF"]]}]},
 # template_has_deadline=True, tpl_abs="/root/workspace/wh-remix/out/s_84_v1.png",
),
]

srun.py builds the final prompt: product LOCK (Image 1 = jar, exact label) + "IMAGE 2 = the template ad to clone 1:1" + PIXEL INVENTORY + TEMPLATE DNA + SCENE LOGIC + PRODUCT PLACEMENT + CHANGES + TEXT (exactly, nothing else) + constraints (1:1 square, re-flow vertical templates without dropping elements, render only the listed text once, nothing of their product world, adults over 25, jar = exact replica).

Step 3 — Lint and sanity checks (blocking)

ssh vps-claude 'cd /root/workspace/wh-remix && python3 lint.py sam-batch/s5specs.py'

Then the D13 template-path check (wildhorn/paths-and-commands.md §6). Fix every error; never bypass. Lint blocks: missing decode fields, banned words, "belly" without "beer", invented deadlines, generic/raw/veiny/brown organs, missing inventory/placement, sexual on OpenAI without fallback, fallback without composite, jar-count parity, seedream_full, bare WILDHORN wordmark line, emoji in composite.

Step 4 — Generate (parallel, logged)

ssh vps-claude 'cd /root/workspace/wh-remix/sam-batch && printf "%s\n" 84 85 86 87 88 89 90 91 92 93 > jobs5.txt && nohup sh -c "cat jobs5.txt | xargs -P 5 -I{} sh -c \"python3 srun.py s5specs.py {} > logs/r5_{}.log 2>&1\"; touch logs/_r5done" >/dev/null 2>&1 &'

~110 s per gpt-image-2 image (quality high, 1024²). Refusals switch automatically to the fallback. Every call lands in calls.jsonl.

Step 5 — QC at full resolution (main context)

Copy the new out/s_NN_vK.png to a local temp folder and Read each one at full resolution, template next to it. Run the 12-point checklist at the end of wildhorn/failures-catalogue.md plus:

  • jar identical (label text, horn logo, proportions, shadow); no misspelled standalone wordmark;
  • every text exact, no typo, no duplicate, nothing extra; spacing and anchor as the template;
  • avatar age; hands; organs; render style; leftovers of their props; before/after obvious;
  • one-second test: the stranger gets the beer belly + the product. Fail → fix the spec (change only X, keep Y) and regenerate before showing. Composite fixes (strike line, shadow, text spacing) are cheap — use them.

Step 6 — Review page and hand-off

  • Build the review page (copy sam-batch/build_sam.py for a new batch): only ads to review, each row = template + every try (latest highlighted) + why / DNA / scene / text, validated ads hidden (D3). Add the hit-rate table vs previous runs.
  • Give Adrien ONE link (e.g. https://blueprint.machineroom.app/sam), say how many ads, and ask for his Loom. Short message, no victory lap.

Step 7 — Ingest the Loom (the feedback loop)

  1. Save the Loom mp4 to feedback/loom-<batch><round>.mp4; transcribe with mr-transcribe … --lang en (API only).
  2. Read the transcript fully. Build the coverage matrix for it (time · feedback · rule) exactly like wildhorn/adrien-feedback.md §3 — every distinct remark mapped to a rule; if none fits, write a new rule first (next free ID, origin, evidence) in LESSONS.md + wildhorn/lessons-wildhorn.md, and add a lint check when machine-checkable (D4, D11).
  3. Update validated.json for every ad he mentions (✅ first try / ✅ redo / ❌ reason). "Try 1 was better" → sell_override.json and freeze it (A20/A26). An ad he doesn't mention stays ⏳ — ask, don't assume (S62 waited a round).
  4. Write the feedback loop on https://blueprint.machineroom.app/protocols: "what worked and why" + "every miss, root cause, permanent fix" (pattern: sam-batch/proto_sam2.py). Rebuild /lessons.
  5. Redo rejected ads following ONLY what he named (A20, A22), using the liked try as tpl_abs when only wording changes. If an ad failed twice, stop re-prompting and apply A25 (how was THEIR ad made?).
  6. Generate the redos + the next 10 templates (D12), QC, rebuild the review page, send the link.

Step 8 — Close the batch

  • Rebuild /sam-final-style page (every try + SELL VERSION + stats), /wildhorn-ads-style page (validated, images only), /all-ads (build_all.py, add the new set).
  • Export to the Mac: rsync -a vps-claude:/root/workspace/wh-remix/<batch>/sell/ ~/Downloads/Wildhorn-<Batch>/ (new folder per batch).
  • Compute stats (first-try %, after one fix, final, calls per validated ad) and add them to the pages.
  • Append new ads to kit/creatives.jsonl (template · angle · headline · image) so nothing is made twice.
  • Write the checkpoint (~/.claude/bin/checkpoint wildhorn-batch-test --write) and update the Mac memory note wildhorn-remix-system.md with the load-bearing changes.
  • End your message with the demand → status table (✅ done+verified / 🔨 in progress / ⏳ blocked + reason).

4. Engine decision tree

Template has text only, no scene?            → engine="pure_comp" (solid bg + composite text). S4.
Template is a normal photo/illustration?     → engine="openai" (gpt-image-2 high, Image1=jar, Image2=template), fallback="seedream_comp".
Sexual / lingerie / skin / bare chest?       → sexual=True; OpenAI may refuse → seedream_comp:
                                                 sd_prompt = scene only, NO text, NO product, empty zones where text/jar go;
                                                 composite = real jar(s) at every placement + exact text (Montserrat/Anton/Oswald).
                                               OpenAI is fine for suggestive FOOD objects (banana, glazed donut).
Man boobs close-up?                          → tight t-shirt / thermal / X-ray via OpenAI, or Seedream scene + composite.
Text must be painted INTO the scene          → kie_gen.py --model nano (Nano Banana Pro spells well), then composite the jar.
  (sunscreen, chalk, marker, clay letters)?
Their ad is a real photo with a pasted       → A25: Seedream minimal edit of THEIR image (age the man, clear text, keep aspect)
  product (jar as a head, etc.)?               → jarswap.py on the jar box → composite text.
Only the wording must change on a liked try? → tpl_abs = that try; texts changed only.
NEVER                                        → seedream_full (Seedream rendering text or the jar), emoji in composite, a WILDHORN letter mark.

Composite spec cheat-sheet: coordinates are fractions (x,y,h of the image). jar = one jar (y = bottom), jars = several (D6 parity with placement). texts[].runs = list of [text, colour(, weight)] for multi-colour lines; maxw wraps; shadow for text on photos; sunscreen for the lotion effect; strikes for crossed prices; rects/band paint solid zones first.


5. The review loop with Adrien — what he expects

  • 10 per round, a review page with ONLY ads to review, template + first version + every new version side by side (D3), and the hit rate vs run 1.
  • He records a Loom; he speaks fast and judges in one look. "Not understandable" = fail. "Great / perfect / amazing" = validated. "Make another version" = change the IDEA, not the words (C8). "Try 1 was better" = freeze try 1.
  • He ALWAYS asks for the feedback loop: why the good ones worked, why the bad ones failed, the rule that prevents it — and he checks that the next batch applies it. Repeating a mistake he already flagged (logo, text spacing, off-angle) is what angers him most.
  • He wants the system to improve: every correction becomes a permanent rule in LESSONS + lint + the protocols page, and he expects new templates to be right on the first try ("you could have done this from the first try").
  • His favourite verdicts came from: copying the template almost pixel-for-pixel with only our nouns (#21, #25, #63, S14, S83); deep avatar precision (#8, #9, #44, #47); aggression; organs he can see and would eat; beer belly named everywhere.
  • Full digest and matrix: wildhorn/adrien-feedback.md.

Recap format after each round (his trust mechanism):

Demand Status
S84–S93 generated + QC full res ✅ 10/10, QC fixes: S87 text spacing
Loom 5 redos S42 S50 ✅ regenerated, frozen tries untouched
New rules from Loom 5 ✅ A32 added + lint check
Review link ✅ https://blueprint.machineroom.app/sam

6. Worked micro-examples (pattern → result)

  • Flip their object for our result — S1 Mars Men bananas growing (penis size) → leather belt loops shrinking: "WISHING YOU HAD A FEW FEWER INCHES?" — first try.
  • Same angle → copy — S14 RYZE "LOST MY WAISTLINE — Last Seen 3 Weeks Ago": flipping it failed; copying it word for word won.
  • Same shape — S23 moon texture ↔ round beer belly: "THIS SHAPE BELONGS ON THE MOON / NOT ON YOUR BEER BELLY" — first try.
  • Copy the action — S18 Cowboy Colostrum pours powder into coffee → beer poured into his pint, capsules beside, horn icon: "If you're on the beers, this is for your beer belly."
  • Re-derive the innuendo — #61 pineapple (vaginal probiotic) → giant banana from below: "She Calls It Heaven ;)".
  • Keep the social mechanism — #63 "STEP 1: LOSE THE BEER BELLY / STEP 2: LET NO ONE HIT".
  • Make the invisible visible — #40 hand holding a transparent capsule packed with small organs; #70 B7 = the reference organ visual.
  • Copy their production method — S11 Primal Viking painting: their image edited minimally, our jar as her head via jarswap.py, text by script, 9:16 kept → validated after 3 failures.
  • Fusion without breaking the format — S28 arcade "TESTOSTERONE STATS" + one row "BELLY FAT 900 → 50".
  • Concede the pleasure — #22 "BEER IS FUN. BEER BELLY ISN'T."

7. Template format playbook — how each format becomes Wildhorn (with the ad that proved it)

Template format Wildhorn treatment Proven by
Row/progression of objects (growing bananas, shrinking figures) flip or keep the progression so it shows FEWER inches at the waist; figures face right toward the result S1, S8, S16, S38, S44
Same person split / two portraits (before vs after, "after X vs after X with brand") frame waist-up so the BEER BELLY is the before/after; one problem state vs one solved state S2, S52, S76, S83, #6
One body cut in half (bloated half / toned half) one single man, same skin and shorts, navel exactly on the cut #77
Month / week / day timeline photos male side profiles or belly photos shrinking, facing right; keep their timeline only if they have one S38, S40, S53, S69, #13, #16
Thermal / X-ray / anatomical cutaway the beer belly (or chest) glows; labels = his symptoms; no product if the template has none S6, S22, S79, #2, #23
Symptom checklist / "8 signs of…" "8 SIGNS OF HIGH ESTROGEN IN MEN" with symptoms he recognizes S5, S46, S49
"X is not the problem, Y is" reframe "THE BEER BELLY IS NOT THE PROBLEM. THE ESTROGEN DRIVING IT IS." — same sentence, two nouns #21, S70, S52
Us vs them table / comparison cards / check-cross lists rival = fat burners / generic farmed organ pills; lines = results and pains, never features #1, #3, S54, S65, S37
Cartoon "I use X / I use Y" X = the rival he knows (fat burners) S42
Meme (wojak/chad, Barbie/Ken, cat, Muppet, "said no wife ever", starter pack) keep the meme mechanics; every line a scene from HIS beer-belly life; Ken = our 45+ man #9, S47, #64, S81, S34, S61
Clay / doll / Pixar / painted illustration same render style, our man; never photoreal S49, S52, S76, S83, S11, S15
Visual pun on a shape find an object with the same shape as the beer belly (moon, pear) S23, S50
Shock image (worms, gross pile) equally shocking for the belly: melting like wax, beer cans + pizza crushing a scale S7, S27
Product ritual (powder in coffee, scoop) capsules beside, the drink he already has (beer) poured as beer S18
Ingredient / "it's all in here" / puzzle product 4 organs as recognizable silhouettes, one plain job each S3, #32
Product buried in its ingredients / billboard made of the product fresh appetizing organs with kraft tags; billboard made of real organs S67, #35 B7, #39 B6
Hand holding the product, moody light, stat jar in a man's hand; "93% saw their beer belly shrink*" + footnote S24, S63
Offer cards (special deal, last call, goodbye lowest price, bundle chooser) $49.95 / ~~$100~~ / BOGO / 60-day guarantee; no invented gifts; never Autoship S13, S36, S44, S74, #46, #49, #51
Challenge / guarantee ("90-day challenge", "XL to M or money back") keep their structure, our guarantee S41, S68
Text-only post / manifesto / handwritten same words, only the excuse or the noun swapped; render by script or keep the handwriting S4, S9
UGC (TikTok captions, Day 0/Day 90 selfies, unboxing) his voice, beer belly + her reaction; 50,000+ proof S20, S21, S72
Advertorial teaser ("Why men … can't …", "Read the solution →") "Why men with a beer belly after 40 can't keep up with their kids" S32, S33
Celebrity/athlete holding the product replace with our avatar, proof by his age ("AGE 51") S31, S35
Sexual innuendo object (pineapple, eggplant, cake log, donut) decode it; keep it if it fits a men's product (eggplant, cake log), re-derive it if it belongs to their product (pineapple → banana / donut) #57, #61, #69, #73, #74
Sexual scene (couple, sheets, kitchen counter, her back) older greying man; her desire tied to his lost beer belly; Seedream scene + composite when refused S11, S12, S30, S55, S58, #65, #79
Signed customer review keep the signature with a woman's first name + initial #79
Mascot / personified problem the beer belly personified (beer-mug character with a pot belly) #66, #78
Retro UI (arcade stats, emergency broadcast TV) keep the whole UI; add one belly row / "viewers may see their beer belly shrink" S28, S82

8. Prompt blocks used by srun.py (verbatim, for manual prompts too)

LOCK (top of every OpenAI prompt):

IMAGE 1 = product reference: the WILDHORN Wild American Bison capsule jar. Reproduce it exactly as in Image 1: amber glass jar, matte black lid, cream label with the WILDHORN wordmark and horn logo, WILD AMERICAN BISON, the bison illustration, Untamed Bison Nutrition, black band NATURAL TESTOSTERONE SUPPORT* / 30 CAPSULES. Real proportions, real 3D object with contact shadow and the scene's light. IMAGE 2 = the template ad to clone 1:1: same layout, composition, render style, palette, typography treatment, spacing and the SAME AMOUNT OF TEXT.

Body: PIXEL INVENTORY (KEEP / SWAP — follow exactly) · TEMPLATE DNA · SCENE LOGIC · PRODUCT PLACEMENT (copy the template) · CHANGES (visual) · TEXT (exactly, nothing else).

CONSTRAINTS (bottom):

USE CASE + CONSTRAINTS: Square 1:1 Meta feed ad, agency-grade. If the template is vertical, re-flow into the square without dropping elements and keep the template's spacing between text blocks. Render ONLY the listed text, spelled exactly, once — nothing added. Nothing from the template's product world may remain (product, brand, logo, flavor, packaging). Anatomically correct, adults over 25. CRITICAL: the WILDHORN jar, when present, is an exact replica of Image 1.

Add to visual when relevant: the HORN suffix (D8); "do NOT copy the template's person — " + OLD (A11); "NO jar, NO product" when the template has none (C7); the render style by name ("Pixar-style 3D, NOT photoreal"); the animal ("a wild American bison, NOT a cow, no spots") (C16). Seedream sd_prompt: scene only — "No text, no product, no logo", name the empty zones ("the top 30 % is plain orange") so the composite has room (D7).

9. Known gaps and traps (read before trusting a source file)

  • PRODUCT.md/kit/product.md list "Autoship -50%" in the locked offer and "Cible: hommes 40+" — both are site/targeting facts, banned in ad copy (B7, B2).
  • LESSONS C2 contains both "FREEZE-DRIED matte" and "FRESH glossy" wording. The latest verdicts win: fresh, clean, deep red, appetizing, smooth silhouettes, no veins (lint blocks "freeze-dried/brown"). Old shared strings in s1specs.py (ORGANS "freeze-dried matte deep red-brown") and batch-08/09 would fail today's lint — don't copy them.
  • Several validated Sam specs still contain a Wordmark: "WILDHORN" text line (S19, S35, S43, S63, S71, S72, S73) from before D8; QC replaced misspelled marks. For new work: horn icon only.
  • Spec files point to the wrong template for S29 R3, S33 R3, S35 R3, S55 QC, S79 QC, S80 R4 (D13). S29's "style changed" came from this.
  • stats_run1.json ignores batch-09 (no meta.json) — its final map says B8 for ads whose final is B9 (except #74, really B8).
  • Loom 1 (batch-01 review) and Sam Loom 5 (S11) have no transcript; Loom 1 survives as the "Feedback log — batch 01" table on /protocols.
  • Survey stat wording differs: landing "93% felt it", ads "93% saw their beer belly shrink"; the compliance audit flagged 93 % vs 84 % and 60 days vs 12 weeks on the site — keep the asterisk + "12-week customer survey" footnote on every use.
  • jarswap.py's prompt is hard-coded for "jar replaces her head" — edit before reuse.
  • The lint "men over 40" pattern only fires when followed by a quote; check by eye.