SKILL: Native Ad Generation — Full Pipeline (Portable Agent Edition)
Purpose: Complete start-to-end doctrine for generating Meta native ads (long-form Facebook personal-story ads + organic-looking images) for DTC ecom brands. This document is self-contained — a fresh agent can run the workflow with only this file plus brand/avatar research supplied per task.
Source of truth (original workspace): skills native-ads, native-copy, native-image-gen, direct-response-copywriter, brief-builder, qa-gate, image-prompt-engineer, humanizer + memory rules. Compiled 2026-07-21. The live workflow is unchanged; this is a duplicate for a separate agent.
1. PIPELINE OVERVIEW
Every native ad batch runs this sequence. No stage is optional.
1. BRIEF assemble creative brief (contract — validated before writing)
2. DRAFT write copy variants per doctrine (Zakariah framework)
3. SHARPEN hook-sharpening pass + line-level edit pass
4. HUMANIZE mandatory humanizer pass (strip AI tells, voice-calibrated)
5. QA GATE structured PASS/FAIL review — flags only, no rewrites
6. IMAGES one concept per ad → generate → image QA → crop/regen
7. DELIVER copy.md + PNGs in one batch folder
A "native ad" here = Meta ad where primary text is a raw first-person story (looks like a Facebook group post, not an ad) + an organic iPhone-style image with no product in it. The ad's job is the click to a listicle/advertorial; the lander closes.
2. STAGE 1 — THE BRIEF (contract, not suggestion)
Missing fields = drifting copy. Fill everything before writing.
Mandatory fields:
- Format: native-ad. Variant count: 5 for a new ad (4 if one proven variant already exists).
- Length strategy: 2-3 long variants (500-700 words) + 2 short-medium (150-300 words). Never all one length.
- Angle type — exactly ONE of 8:
1. Identity Disruption — challenges a belief about who she's become (cold traffic, L1-L2)
2. Failed Solution — names what she tried, validates the failure, explains WHY it failed (L3)
3. Future Fear — consequence of inaction, told through story not lecture (any level)
4. Relationship Wound — the problem hurts someone she loves (guilt + protective instinct)
5. Hidden Mechanism — reveals the real cause, "they never told you this" (science-curious)
6. Social Consequence — the problem is visible to others (public shame, private dread)
7. Absurdist Humor — dark-comedy pattern interrupt (tired, cynical avatars)
8. Objection Killer — opens on the #1 objection and destroys it (retargeting, L4-L5; ALSO a proven top performer on cold when the avatar is skepticism-first)
- Awareness level L1 (unaware) → L5 (most aware). Cold Meta traffic = L1-L2. Never make the writer infer it. Cold deployment + L4/L5 copy = automatic FAIL.
- Sophistication stage S1-S5 (how many competing claims the market has already heard).
- Villain — who/what is to blame. NEVER the reader.
- Root cause + mechanism — with status alive | tired | dead. Dead mechanism = FAIL the brief.
- Avatar package — resignation moment, core desires, top objections, failed solutions, and 15-20 verbatim VOC (voice-of-customer) quotes minimum.
- Proof lines — every claim in copy must trace to evidence. Claim without evidence = FAIL.
Angle kill-questions before finalizing: tested in last 30 days? blames the reader? mechanism dead? deployment/awareness mismatch? villain vague? Can you state the belief shift in one sentence? Would she stop scrolling at 11pm for this hook direction?
When delegating to a writing sub-agent: paste the full brief, VOC quotes, avatar detail, format rules, and the NEVER-DO list into the task verbatim. Never summarize the rules. Do NOT include scoring rubrics or full hook-performance history (causes concept convergence).
3. COPYWRITING DOCTRINE (Zakariah framework)
Optimization target: lowest CPA. Period. Not CTR, not engagement. (Confirmed trap: a hook hit 24.8% CTR with 0 purchases — curiosity clicks are not intent.)
The core tenets
- The sale lives at the Resignation Moment. She's exhausted, defeated, has quietly accepted "this cannot continue." Meet her in that flat, calm surrender — not with hype, with quiet understanding.
- Research is the entire foundation. You don't write copy; you assemble it from the avatar's exact language. Depth of research is the inverse of CPA.
- Always externalize the villain. She is NEVER at fault. Villain = a mechanism, biology, an industry, bad advice. Without a villain she blames herself → freezes → no sale. With a villain she has something to be angry at → anger creates motion → motion creates purchase.
- Inviolable logic chain: Root Cause → Mechanism → Product. Diagnose the real root cause, introduce a unique mechanism that solves it, product is only the delivery vehicle. Product reveal = confirmation, not pitch.
- Funnel congruency. The lander must begin exactly where the ad left off — awareness mismatch = bounce.
- Never discount; build more value before the price reveal.
- Name the mechanism. A proprietary name = category ownership.
- Lead is written last — it sells the read, not the product.
- Specificity = believability. "47,342 customers as of last Tuesday" beats "thousands." Target specific:generic ratio 3:1.
- Give the algorithm 7 days. 24-48hr data is noise.
Mechanism framing: Gap vs Trap
- Gap = the old solution failed to deliver → she can rationalize it → emotional ceiling is frustration.
- Trap = the old solution actively WORSENED the problem; every fix attempt compounds it → rationalization-immune → urgency/dread.
- Always use Trap framing when the mechanism allows it. Inaction must feel dangerous, not just suboptimal.
The 10 hook types (pick to fit the angle)
- Self-Incrimination — she confesses something she'd never say aloud (STRONGEST)
- Behavioral Evidence — a specific behavior that proves the problem, no labels
- Consequence Snapshot — one vivid time-stamped moment of damage already done
- Question That Can't Be Answered — forces confrontation with what she's avoiding
- Contradiction/Paradox — two things that shouldn't both be true, but are
- Social Proof Interrupt — someone else's result or reaction
- Mechanism Tease — hints at a hidden cause without revealing it
- Dark Humor — says the painful thing with a laugh
- Direct Challenge — "You're still doing X?" (high risk/reward)
- Resignation Statement — flat, calm defeat: "I stopped trying."
The hook bar: would she stop scrolling at 11pm, half asleep? If the hook needs setup or context, it isn't a hook. Hook = private behavior, not private feeling ("I set 14 alarms. I slept through every one." — not "I felt so exhausted").
Emotional architecture
- An angle is a belief system containing 3-5 emotional triggers in sequence — build cumulative voltage to ONE primary emotion's peak. Don't scatter.
- Emotional state first, then demographics. Find the converting state (resignation, shame, exhaustion, fear of permanent damage), then layer the demographic scenario on top.
- Make inaction more dangerous than action. "In three years he starts college. Who's going to wake him up?"
- Victory = ABSENCE, not presence. Write what STOPPED happening, never what started. "I didn't yell today." / "He hasn't missed a shift in six weeks." Never "mornings are peaceful now."
- Layer 3 rule / external witness: someone else (spouse, teacher, neighbor) notices the change BEFORE the protagonist announces it.
- The P.S. is the emotional climax — the most devastating line in the ad, delivered like an afterthought too vulnerable for the main copy.
4. NATIVE FORMAT RULES (non-negotiable, check every line)
Line format
- 1 sentence per line. Default always. 2 only if the pair genuinely flows. NEVER 3+.
- Period = line break. No em-dashes, ever — use periods + new lines.
- No emoji anywhere except 👉 on CTA links.
- Dialogue ALWAYS isolated on its own line.
- Fragments: separate lines when each is an emotional punch ("The knocking. / The yelling. / The door slam."); clumped on one line when they're one fluid action ("Eyes open. Turned it off. Walked back.").
- "Long" = MORE lines with breathing room, never dense paragraphs. Even long variants must scan like a Facebook post.
- Final pass after writing: scan every line, split any with 3+ sentences.
Meta ad anatomy
- Primary text = the ad. She reads it first. The scroll-stopping line MUST be line 1 of primary text.
- Lead with the most intriguing element, not the chronological start. Never scene-set in line 1. Direct dialogue as line 1 hits hardest ("Do you need help? I hear screaming from your house every morning.").
- Headline (Meta
title) = bottom of the ad, read LAST. Reinforcement or second punch — never the hook. First-person voice, sentence case, no emoji, unique per variant. - CTA goes at the product reveal, not just at the end.
Variant system (5 per ad, each genuinely different)
Types: (1) Story/Resignation Arc, (2) Objection Killer — top performer, write 2 when possible ("Another alarm? Sure." energy; the drawer of failed products is her entry point — even story variants benefit from an opening skepticism beat), (3) Pain-First → Mechanism Reveal, (4) Consequence/Future Fear, (5) Risk Reversal + Social Proof.
Diversity rules (prevents writing 1 ad 5 times): - Each variant varies at least one dimension of Persona × Desire × Awareness. - Mechanism delivery must differ per variant — rotate: full science (max 1) / casual-vague / secondhand ("my sister sent me an article") / barely explained ("it vibrates instead of making noise, I don't fully get why that matters but it does") / analogy / skipped entirely. - CTA format must vary — real people link differently. Never paste the same "$X. 60 nights. Full refund." block on every variant; weave price/guarantee into each story naturally, or skip it. - No duplicated hooks, headlines, or analogies across variants. - Social-proof reviews must sound real: typos, incomplete thoughts, a 4-star mixed in, platform references ("saw this on Amazon"), one that reads like it was typed at 2am.
Proven cadence patterns (use these rhythms, don't invent)
- Anaphora: repeated structure on separate lines building rhythm.
- Internal monologue stacking: short obsessive circular thoughts, each on its own line.
- Failed-solutions list: short, stacked, each line = product + price + verdict ("Boric acid. Burned like hell. Came right back.").
- Trigger scenarios: question + answer pairs ("Field trip? She overslept. Test day? She overslept.").
- Timestamped transformation: "Day 3: he woke up before I did." — concrete days, never "after a few weeks."
- Waiting-for-it-to-fail beat: after it works, she waits for it to stop working ("Like you wait for thunder after lightning. Nothing."). Validates her skepticism, makes the win real.
- "No X. No Y. No Z." denial rhythm for the transformation section.
- Cadence: alternate Long (build) → Short (punch) → Short (promise) → Long (explain) → Short (reveal). Read aloud; if you stumble, rewrite.
Failed-solutions stack rules
- Every failed solution gets a price, and prices should TOTAL more than the product price (anchor inflation — reveal feels cheap by comparison; do the math for the reader at the close).
- No same-channel failed solutions. If the product mechanism is tactile, the failed stack must be sound/light/routine/app — never touch. Category-wide rule.
- Generic descriptors, never competitor brand names in published copy: "the famous extra-loud alarm clock," "smart speakers," "the alarm app with the barcode," "a smartwatch." (Brand names stay in internal research only.)
- Implicit escalation beats long lists: "Loudest alarm clock. Then a louder one."
- Universal witnesses for shame beats: teacher, principal, neighbor, in-law, doctor — not coach/tutor/pastor (narrow).
- Kill bridge sentences ("I tried everything," "I'd placed my hopes") — the prices and specifics do the work.
NEVER-DO list (violating any = rewrite the variant)
Hooks: never open with mechanism/science (confirmed dead: $20 spend, 0 purchases) · never scene-set or start chronologically in line 1 · never put the best line in the headline field · never open with an inventory list · never generic feature hooks · never curiosity-bait that doesn't lead to the sale. Language: never "game changer / life changing / revolutionary / amazing / incredible / journey / struggle / battle / warrior / graveyard" · never weak modifiers ("very, really, just, truly, literally") · never writerly-poetic phrasing where a real person would say something uglier ("the drawer I can't open without getting mad" > "the graveyard of failed alarms") · never polished testimonials — Reddit/Amazon voice converts · never lead with reviews (instantly reads as an ad). Structure: never mechanism in the opening (middle only, after emotional setup) · never the same mechanism paragraph, CTA block, or analogy across variants · never victory-as-arrival · never skip the villain. Avatar: never generic labels ("busy mom", "stressed professional") — VOC words only · never wrong awareness level · never blame/shame the avatar · never "sometimes/usually" — she says "every single morning" · never vague future-pacing ("you'll feel better" = nothing; "he walked downstairs on his own Tuesday" = conversion).
5. THE AVATAR (who you're writing to)
The avatar doc is the WHO; doctrine is the HOW. Default to the avatar's words over your own, always. Check the VOC bank before reaching for any word; their word converts, yours doesn't.
The 7 mandatory avatar-extraction categories
Extract ALL of these from avatar research into every writing brief. Missing any one = generic copy, every time: 1. Failed solutions stack WITH visceral detail — not "tried alarms" but the unsettling specific: he walks to it in his sleep, eyes open, solves the math puzzle unconscious. 2. Anticipation anxiety — what happens BEFORE the problem each day (wakes before her alarm from dread; the mental buffer math). 3. The scene after — the silent drive, the parking lot, the replaying. Concrete and visual. 4. The "I've heard that before" trap — she's exhausted by suggestions; this is the skepticism objection-killers must mirror. 5. Relationship cost — accumulation, not one fight; and the repair moment when it starts working. 6. Victory as ABSENCE — what stopped happening. 7. VOC word bank — her actual words organized by emotional state.
Relatability register (Facebook DTC mom audience)
The buyer is the average working/middle-class American mom — she must feel like the reader, not someone the reader watches on Instagram. - Jobs: dental receptionist, school admin, daycare worker, teacher, bank teller, nurse aide, grocery checker, hair stylist. Dad: warehouse, contractor, mechanic, HVAC, truck driver, foreman. - Settings: laminate counters, oak cabinets, Honda Pilot, family photos on the fridge, Target/Walgreens/drive-thru. - Banned aspirational signals: Fortune 500 / corner office / assistant / MBA / bourbon / designer brands / Tesla / country club / "stakeholder / deck / OKR" jargon. - Test: read the ad as a 43-year-old mom in a Target checkout line. Anything sound like someone she doesn't know? Replace it.
Demographic variation per batch
- Vary the featured kid/user across variants — ages spread (teens 13-18 for teen products, no pre-teens), mix sons/daughters ~60/40, vary the mom's job across the batch too. Never 12 ads about the same "14-year-old son."
- Where a condition is part of the avatar (e.g. ADHD): one natural identification line per ad ("diagnosed in fifth grade") — identification only, never treatment/efficacy claims tied to the condition.
- Keep medical/temporal details realistic and internally consistent (medication timelines track the kid's age; pronouns fully consistent within an ad).
6. VOICE — HUMANIZER PASS (mandatory pipeline stage)
Every native copy batch gets a humanizer pass between draft and QA. Purpose: strip AI tells that readers (and possibly Meta's classifiers) pattern-match — rule-of-three cadence, engineered aphorisms, staccato punchline stacks, negative parallelisms ("not X, but Y"), inflated symbolism, filler phrases.
Constraints:
- Preserve ALL DR beats: price anchors, guarantee terms, mechanism explanation, avatar identification line, CTA.
- Max one "signature line" (quotable aphorism) per ad.
- Humanized variants ship as NEW ads — never overwrite live ads.
- Record which tells were removed (tells_removed) in the output file frontmatter.
Voice calibration: seed the humanizer with a real-writing corpus from a Reddit thread whose posters ARE that ad's narrator — per-speaker, not per-batch (mom-narrator ad → mom thread; teen self-voice → teen thread; dad-POV → dad thread). The rewrite inherits real sentence rhythm, word choice, and quirks. Corpora are research-only — never quote them verbatim in ads.
7. SHARPENING PASSES (before QA)
Hook-sharpening pass (mandatory)
Re-read line 1 of every variant and grade: - WTF? Stops scroll? Creates a question she HAS to answer? Screenshot-worthy? - Specific? Contains a concrete number/name/object/moment? Generic hooks die. - Gap? Opens a loop only the copy can close? Failure patterns: too bare (add the MOMENT) · too generic (add the SPECIFIC story) · too subtle (add the CONSEQUENCE) · statement without tension (add the CONTENT) · product-list-as-hook (add the TOTAL + tease). The hook is the only line that matters at scale — spend more time on it than anything else.
Multi-model sharpening (if two models available)
Run two independent read-only reviewers in parallel over: hooks (WTF 1-10, flag <7 with a rewrite), copy quality (AI-tell language, filler lines, soft CTAs, pacing — always provide the replacement line, never just "this is weak"), framework alignment (awareness level, mechanism specificity, earned resignation moment, villain present — a variant missing BOTH resignation moment and villain never passes), avatar fidelity (her words vs a copywriter's; lines 3-8 specificity test — broad lines there mean the avatar was assumed, not found in VOC → rebrief, not line-fix). Both flag → auto-fix; one flags → surface for operator judgment.
8. STAGE 6 — IMAGE GENERATION
Philosophy
"The uglier the ad, the more native it looks." The image's only job is to stop the scroll and create curiosity — NOT to explain or show the product. It must look like a real photo a real person took.
Core rules (never break)
- NO product in the image. Ever. No branding, no logos — it must not look like an ad.
- ONE weird/wrong/off thing per image. One focal absurdity, not five.
- Plain, simple backgrounds. The weird thing IS the scene.
- iPhone quality. Raw, unfiltered phone-camera feel. Never stock/editorial/studio.
- The weird thing relates to the ad's story — loosely is fine; a loosely-related absurd image beats a perfectly-aligned boring one.
- NO timestamps, clocks, or time-implying numbers, ever (dead AI giveaway). Imply time of day through lighting only. Exception: when the ad's concept IS the alarm itself, visible alarm-screen UI is allowed — the rule is anti-AI-tell, not anti-concept.
- Always 1:1 square.
People vs objects
- Default anchor = human reaction or consequence. Prop-only still-lifes (sticky note, envelope, pile of tubes) are a confirmed weak format.
- Objects work only when they show the CONSEQUENCE of human behavior.
- Selfies: candid/mirror style OK, but every selfie needs its own wtf factor — "looking tired" is not enough; the person must be doing/wearing/holding something absurd.
- Avoid the "crying mom with smudged mascara" cliché — show distress through what's around the person or what they're doing.
- Caught-action beats still-life: mom snatching the phone mid-scroll > the phone lying on a table.
The WTF spectrum
Too tame: messy bed, coffee cup (scrolled past). Sweet spot: frowning face drawn in pancake syrup; school bus pulling away from an abandoned backpack. Err on the side of weird — if it doesn't make you go "wtf" in under 1 second, it's too tame. Physically-impossible is fine for non-screen scenes as long as it still feels like a real photo; surreal dreamscapes are not.
Prompt formula
[subject: one simple object or person] + [the ONE weird thing] + [plain background]
+ [lighting: morning light / phone flash / dim hallway] + [camera: iphone photo, phone photo, overhead, from doorway]
+ [feel: raw, absurd, funny, unsettling, sad]
Always end with camera/feel qualifiers. All prompts lowercase. For batch consistency, extract a JSON style template from a winning image (lighting/camera/mood locked) and vary only subject + constraints; include a negative_prompt list: professional lighting, stock photo, editorial, product, clock, timestamp, logo, studio, posed.
Modern-reality anti-defaults (image models drift toward AI-tell clichés — override)
- No generic "2010 American kitchen" (wooden table + coffee mug + bread) AND no Pinterest-luxury override (matte-black quartz, brass pendants) — use the avatar-native lived-in suburban interior: light oak cabinets, laminate counter, fridge covered in family photo magnets and a kid's drawing.
- Hands must match avatar age (40s mom: slight wrinkles, worn wedding band, natural nails — not influencer hands).
- Phones must be CURRENT models with real, current OS UI — if you can't specify the screen precisely enough to be plausible, cut the screen from the concept.
- Vary repeated formulas across a batch (writing-on-body: rotate body part AND tool; locations: kitchen/hallway/car/school/bathroom).
- Accumulation visuals for duration ("years of this"): stack of school excuse slips, wall of escalating sticky notes ("Wake up" → "GET UP" → "PLEASE"), overflowing bin. Avoid abstract metaphors (confirmed too obscure).
- Person presence when the angle is about a specific person; two-people side-by-side for state contrast (mom in work attire next to teen in pajamas); authority figure in foreground for consequence angles; translucent "ghost mom" watching a future scene for future-fear.
- Never repeat a visual motif within a batch.
Generation tooling (current, 2026-07)
- Primary: Higgsfield CLI with GPT Image 2, 2K, square (operator ruling 2026-07-20):
bash higgsfield generate create gpt_image_2 --prompt "..." # defaults: 1:1, 2k, quality high higgsfield generate wait <job_id> --json # then curl the result_url - Fallback: Nano Banana Pro (Gemini image gen) — a Python script invoked with
--prompt,--filename,--resolution 1K(1024×1024), optional--input-image <path>for targeted edits to an approved image instead of full regens. RequiresGEMINI_API_KEYin the environment (keep keys in.env, never in the doc/prompt). - Only substitute backends deliberately — flag, don't silently switch.
- Generate ~2 at a time; iterate on the ONE weird thing, not the whole scene.
Image QA (before delivery)
- If the image contains ANY readable text: inspect it — every word spelled correctly and sensible? Garbled → regenerate without text, or move text to a post-production overlay in the ad builder. Prefer no baked-in text at all.
- Vision-check: looks organic (not a polished ad)? No garbled artifacts? No stray hands/fingers? Composition matches the concept? No clocks/timestamps?
- Never deliver an unreviewed image.
9. STAGE 5 — COPY QA GATE
One independent read-only reviewer. Flags only — the reviewer never rewrites. Never deliver raw unreviewed output.
Checklist: - 3+ sentences on a line (flag with line numbers) · em-dashes · dead words ("game changer," "amazing," "literally," "very/really/just/truly," …) - Mechanism in the hook (belongs mid-copy) · lead sells the product instead of the read - Duplicate hooks across variants (>50% shared phrasing) · missing headlines · templated CTAs - Villain present and external (flag if missing or if villain = the reader) - Awareness level matches the brief - Word count: natives have NO cap — long-form runs as long as the story earns; other formats keep their limits - Plus the doctrine checklist: avatar's exact language present? ONE primary emotion built to peak? 3+ open loops, all closed? 3:1 specificity ratio? Time-stamped sensory future-pacing? CTA at product reveal? Passes the read-aloud test? Contains "the detail they wouldn't make up"?
Output format:
QA RESULT: PASS | FAIL | PASS-WITH-FLAGS
BLOCKING: (must fix — line-referenced)
FLAGS: (should fix)
PASS ITEMS: n of m
FAIL → writer fixes → re-run QA. Only PASS / PASS-WITH-FLAGS ships.
10. DELIVERY FORMAT
One batch folder per run:
output/{brand}-natives-{date}/
├── copy.md ← all variants, labeled
├── native01-{slug}-square.png
├── native02-{slug}-square.png
└── ...
copy.md per-ad block:
## Ad 01 — {slug}
**PDA:** Persona={...} | Desire={...} | Awareness={L#}
**Structure:** {variant type}
**Hook:** {line 1 of primary text}
**Headline:** {Meta title field}
{full ad body — 1 sentence per line}
P.S. {emotional climax line}
**CTA:** {cta text} | {destination URL}
Destination = listicle/advertorial (not the product page) when the funnel has one; duplicate each ad to both listicle and PDP destinations and let the platform pick the winner. Route by angle: condition-specific angles → condition-specific lander; general → general lander; when in doubt, the broadest lander.
11. OPERATING RULES FOR THE AGENT
- Never write copy without the brief + avatar doc loaded. Doctrine says: you cannot write copy, only assemble it from research.
- Check competitive landscape before writing (saturated angles = avoid or clearly differentiate; prioritize white-space angles for 60%+ of a batch; never duplicate a competitor's exact hook).
- Never judge live campaigns on <7 days of data; CPA is the only decision metric.
- One winning angle → many hooks → many concepts. Angle = WHAT, hook = the scroll-stopping first line, concept = the format/execution.
- Batch hygiene: no two ads share structure, entry point, narrative voice, or visual motif.
- Every stage's output is reviewed before the operator sees it. No raw drafts, no unreviewed images.