Process skill, not a single format. Take any reference ad (one of our own winners, a non-competitor scaling ad, an organic viral video, or a lane-leader competitor's ad), dissect it with scripts/ad_dissector.py, decide what survives by source type, remix it with ONE innovation (80/20), match its measured pacing, and hand it to the right format-* skill for production.
Lane: none of its own (routes to the target format's lane; dissect = Gemini + ffmpeg) · not built yet: 3 (see below) · source: /Users/ayden/.openclaw/workspace/skills/format-ad-clone
1. Read first
knowledge/ad-formats/_FORMAT-CORE.md (doctrine, lane limits, gates, launch). Binding. The format skill you route to adds its own rules on top.
references/beat-sheet.md (the 8-step clone sheet, the remix sheet template, an ILLUSTRATIVE worked example) and references/sources.md (the clone method's reference videos + our receipts).
knowledge/concept-formula.md (4 slots + iteration mode). Override: its slot-1 wording "a scaling competitor's live winner… mirror it beat for beat" predates corrections 10-05 and is superseded for lane-leader competitors (§5 table below).
~/.claude/projects/-Users-ayden/memory/corrections-hot.md entries 10-05 "Beat the leader, don't mirror its ads" and "Proven product = the leader's product".
- Dawn data:
output/dawn-combo-map-2026-10-05/MAP.md (what pays, recipe A vs B), knowledge/brands/dawnbands/product-truth.md (facts only from here).
scripts/ad_dissector.py docstring (outputs + rules); scripts/cartoon_h3/reskin.py docstring (re-skin modes).
2. When to use / when not
- Use whenever a reference video drives a new ad: Fish drops a link, a non-competitor ad is scaling (TrendTrack/Foreplay), an organic format is viral, or one of our winners should move into a new format or a new style.
- Evidence status: method signal, outcome untested. The 10-01 beauty-format mirrors (Blushe monologue + plane skit, Smooche rate-them, pure 1:1 mirrors of non-competitor 8-figure ads) are live in SCALE ad set 120249989091270232 with the verdict due 10-08. Read that verdict before running a second pure mirror. Competitor beat-for-beat mirroring is already ruled out (Fish 10-05, Kalda). davidaistar's clone claims (organic-format hijacks beat standard DR ads) are his, unverified.
- Don't use for: a lane leader's ad as a template (gap map only), reposting or editing anyone else's footage into our ad, celebrity or fake-founder formats (REPORT §3: skip), or a format with no character for Dawn (character-less explainers got 0 purchases, core §1).
Input: one video (mp4, Foreplay share URL, YouTube/TikTok URL) or one static. Output: a filled remix sheet (output/ad-dissect/<slug>/remix.md) that names the source type, what is kept, the ONE innovation, the pacing band and the target format skill, followed by that skill's pack. No pack is written here; the format skill writes it.
| Step |
What happens |
Tool |
Paid? |
| 1 Source |
Pick a proven reference with a receipt (CPA, spend, run length, duplicates, play count) |
§9 sourcing |
free (TrendTrack API = credits per row) |
| 2 Classify |
Own winner / non-competitor scaler / organic viral / lane-leader competitor |
§5 table |
free |
| 3 Dissect |
Timed beats, hook, persuasion, production read, measured pacing |
ad_dissector.py |
1 Gemini 3.1 Pro call + Scribe minutes |
| 4 Keep/change |
Fill the keep/change table for this source type |
remix sheet |
free |
| 5 Remix 80/20 |
Source structure + our 4 concept slots + ONE named innovation |
remix sheet |
free |
| 6 Pacing match |
Set the band from pacing.json; write min_wps/dead_air/gap_turn_max for vo_check |
remix sheet |
free |
| 7 Route |
Pick the format-* skill by the device the dissect found |
§6 table |
free |
| 8 Hand off |
That skill's beat sheet → pack → its gates → core §4 gates |
format skill |
per format |
4. Why it sells
- A reference ad that already scales has solved retention (hook, beat order, pacing). Cloning its structure buys that for free; our copy, VOC and mechanism carry the sale. That is the 80/20: about 80% proven structure, 20% innovation, with exactly one innovation per remix so the read means something.
- Organic viral formats (rate-these, challenge-with-a-timer, science explainer, day 1 vs day 21) stop the scroll because they don't look like ads. Grafting a problem-aware Dawn story onto one keeps that edge (davidaistar HBIENgQIQVU: organic formats, not competitor ads, are his best clone sources).
- Recipe still applies after the clone: story structures map to recipe A (mom accused → explainer inside the story → vindication), callout structures to recipe B (brand voice to her, exhaustion → relief). If a source fits neither, the remix must add the missing piece (usually the stake on HER, caused by the mornings) or it's not a Dawn ad.
5. Beat sheet: the keep/change table by source type (full sheet in references/beat-sheet.md)
| Source type |
How you know |
May keep |
Must change |
Slot-1 eligible |
Dissector flag |
| Own winner |
On our account with CPA/ROAS (MAP.md, atlas, readout.py) |
Everything: body word for word, audio, beats, style (concept-formula iteration mode) |
ONE variable: hook line, belief frame, style (re-skin), or a format port that keeps the body's beats. Charswap ads are NOT own footage (edited third-party/competitor video): structure only |
Yes, first choice |
none |
| Non-competitor scaler |
Scaling on Meta/TikTok in another niche (e.g. Blushe, Smooche beauty) |
Beat order, beat timing, device (rate-them scores, command-opener skit, monologue turn), pacing, shot grammar |
Every word (ours = VOC lines + Fish's ruled lines + product facts), cast, setting, their numbers and claims |
Yes |
none |
| Organic viral (not an ad) |
Big play count, no product, a repeatable format |
The format mechanic + pacing |
Everything else; add the problem-aware opener (lines 1-2 name HER by a symptom) and the product |
Yes |
none |
| Lane-leader competitor |
Sells our product type to our buyer (Dawn: HiStrips/Onyx, FitSleeps; any wrist alarm brand) |
Gap map only: claims they make, objections they answer or skip, weak points, what to beat |
No script, no beat order, no device, no hook copied. Every concept must fail the competitor-swap test |
No |
--competitor |
- Competitor-swap test: put the competitor's name on our finished script. If it still works unchanged, scrap it. A pass needs at least one thing only we can say (our VOC line, Fish's ruled mechanism line, our offer, our paying body).
- Buyer-match question (ask before filling the table; starpop
clone-competitor-ads-with-ai, create-and-clone-competitor-ads-with-ai): does the source sell to HER (mom of a heavy-sleeping kid/teen)? Almost every non-competitor or organic source sells to someone else, so its objection beats answer the wrong objections. Keep the beat's SLOT and position; refill each objection beat with a ranked Dawn objection (survey 9-15 in knowledge/brands/dawnbands/research/customer-evidence-2026-09-15.md: wake doubt 52.6%, wear doubt 18.6%; then the objections list under workflow-copy-research Table 2), never a reworded version of the source's objection. A source objection with no Dawn equivalent is cut, and the slot goes to the next-ranked Dawn objection.
- Same-buyer brands selling a different product for the mornings problem count as lane-leader competitors. When unsure, classify as competitor.
- Dissecting any source is fine. Templating a competitor is not.
- Reusing FOOTAGE (motion, recast, restyle) is a separate, narrower rule set:
format-motion-transfer §5 (own / licensed / organic-viral motion only). This table governs structure, never footage.
- Step 0 — combo plan (feedback loop,
workflow-combo-loop): python3 scripts/combo_loop/plan.py --format format-ad-clone --brand dawn → pick one combo (a paying parent + ONE changed dimension) and paste its block into the pack front matter / job or spec JSON ("combo": {...}; no file → tags.py register --prefix): combo_avatar combo_angle combo_pov combo_authority combo_stake combo_stake_on combo_emotion combo_root_cause combo_mechanism combo_payoff combo_device combo_format combo_parent combo_variable combo_ad_prefix (= the launched Meta ad-name prefix). python3 scripts/combo_loop/tags.py check <pack> must PASS before concept approval; the weekly refresh reads results back by that prefix.
Dissect shows (device / format_name) |
Route to |
| accusation story, two+ voices, vindication |
format-spoken-drama |
| song / musical narrative |
format-song (own song winner, style change only: reskin.py) |
| argument / debate / exhibit |
format-courtroom |
| talking product or object explains |
format-mascot-explainer |
| "if X did Y for 3 weeks", day-by-day |
format-timeline |
| rate-these / ranked failed solutions |
format-rated-solutions |
| short slapstick or command-opener skit |
format-skit |
| two-person podcast / split screen talk |
format-podcast |
| vox-pop, one take per person |
format-street-interview |
| short TikTok-Shop demo (hook → problem → demo → CTA) |
format-ai-actor-demo |
| a trend move / gag / dance where the MOTION is the asset |
format-motion-transfer (provenance gate first) |
| masked or hidden-face insider confession |
format-whistleblower |
| iMessage / notes / app / phone-screen story |
format-ui-mockup |
| static image ad |
dawn-statics |
| photoreal talking head + b-roll |
ugc-omni (avatar gates, core §3) |
| long-copy native + one image |
dawn-native-brief → dawn-native-write (+ native-image-gen) |
- Run ls ~/.openclaw/workspace/skills | grep '^format-' first: a target skill may not exist yet. If it's missing, build from the core + the nearest existing skill and say so in the remix sheet. |
|
| - The remix sheet tags each beat with a shot tier (core §2b) so the target skill can route models and run its draft → final step (core gate 6b). |
|
- Front-matter keys the remix sheet hands to the pack (core §5 keys plus): parent (own winner with CPA, or the closest paying Dawn ad in the target format for an explore), iteration (the ONE innovation), format_skill, source_ref: output/ad-dissect/<slug>/ (free key, the loader ignores unknown keys), and the vo_check keys from §8. |
|
7. Visual grammar (translating the dissect's production read into our lanes)
- Hard cuts clone cheaply; AI morph transitions don't. The dissector only counts hard cuts (scene score > threshold); morph/pan transitions show up only in the beats table. In cartoon-h3 a transition becomes a hard cut or a single panel that moves, never start/end-frame bridging (not wired in run.py).
- Split screens, PIP, UI overlays are editor-built in the source. Our editor is code (core §2a, never CapCut): split screen = ffmpeg vstack/hstack after assemble; cartoon-h3 assemble itself has title + captions + end card (optional,
--end-card; off by default per Fish 10-06) only. Route UI-heavy sources to format-ui-mockup or dawn-statics, or drop the overlay.
- Per-scene start/end frames (§9 command) are the storyboard's composition read: the start frame gives shot size and framing, the end frame shows how the shot hands off to the next cut (starpop
free-video-analyzer-tool). They are for reading only: never pass a third-party frame into canvas/sheet generation as a reference.
- Multi-character shots: core §3 applies (similar-age contamination, no lip-sync in cartoon-h3). A source built on on-camera dialogue becomes listener-staged dialogue (format-spoken-drama §7) unless Fish greenlights the native-speech route.
- Product: the source's product shots never carry over. Band shots follow core §3 (wrist down, display dark, band side-on). Product refs from real in-hand photos, never a white-background cutout alone (10-05 correction, REPORT §2.13). In photoreal lanes, never a generated hand holding, fastening or touching the band (10-04: 3-4/10): real footage, the real cutout composite or a graphic.
- Never copied from any source: a real person's face or likeness, logos, the source's set dressing as-is, burned-in text.
8. Audio (pace match from pacing.json)
pacing.json fields: duration_s, cuts, cuts_per_10s, mean_shot_s, words, wps (Scribe; wps = words / first-to-last-word span, the same basis as vo_check's overall pace). No Scribe → wps missing: rerun without --no-scribe or count words over the span by hand.
- Reveal position: from
dissect.json beats, the start of the first product beat as % of duration_s. Our remix may not name or show the product earlier than that % minus 10 points: an early reveal kills the curiosity gap a story ad runs on (starpop create-and-clone-competitor-ads-with-ai: his own clone's two flaws were an early product intro and a long script). Write the source % and ours in the remix sheet. The source % is product_reveal_pct in pacing.json (dissector, 10-06).
- Bands: runtime ±15% of
duration_s; word count ±15% of words (10-01 mirrors landed -12% to +5%); overall wps within ±0.3 of the source; cuts/10 s within ±25%.
- vo_check keys (code:
vo_check.py reads them from the pack): source narrator slower than the 3.4 floor → min_wps: <source wps − 0.2>; long source pauses → dead_air: <seconds>; dialogue with slow reaction turns → gap_turn_max: <seconds>. Cite the pacing.json value next to each key in the remix sheet. Never set them without a measured source.
- Songs aren't pace-matched to talk: a sung remix follows format-song (Suno sings ~2.0-2.5 wps).
- cartoon-h3 can't cut faster than its beat floor (
SHORT_BEAT_S = 1.2 in storyboard.py merges shorter beats). A source above ~8 cuts/10 s can't be matched on that lane; more cuts also mean more paid batches. Say which band you're giving up and why.
- Voice: from our EL voices or the target skill's spec. Never clone a source creator's voice.
cd ~/.openclaw/workspace
# 1 SOURCE: own winners: MAP.md concepts.json/songs_all.json, hub /atlas/, python3 -m scripts.cartoon_h3.readout --concept <c>
# TrendTrack (non-competitor scalers): web-app CDP route on :9333 (no credits) or API with limit 20-25 after GET /v1/usage
# Foreplay: share URLs from Fish's boards go straight into the dissector (no Foreplay API key in .env)
# Organic TikTok: tikwm search (free, CF-solved), rank by play_count / digg_count:
cd ~/tt-creative-sourcer && python3 -c "import sourcer,json; d=sourcer.tikwm_get('/api/feed/search?keywords=rate%20every%20alarm&count=20'); print(json.dumps([[v.get('play_count'),v.get('digg_count'),v.get('author',{}).get('unique_id'),v.get('video_id') or v.get('aweme_id'),v.get('title','')[:60]] for v in d.get('videos',[])],indent=0))"
# 2-3 DISSECT (one Gemini 3.1 Pro call; Scribe uses ELEVENLABS_SCRIBE_KEY):
python3 scripts/ad_dissector.py <mp4 | foreplay share URL | youtube/tiktok URL> --slug <src-slug> \
--brand-context "DawnBands: silent vibrating wake-up wristband (matte black ribbed band, LED time display dark when idle, 3 alarms, no app); buyer = mom 35-54 whose teen sleeps through alarms; problem-aware" \
[--competitor] [--scene-threshold 0.22] [--no-scribe] [--product-keyword '<source product noun|noun>'] [--pacing-only] [--no-frames]
# → output/ad-dissect/<src-slug>/{source.mp4, pacing.json, dissect.json, dissect.md, frames/}; source.mp4 is reused if present
# --pacing-only = $0 (no Gemini): pacing + frames only. Many sources: --batch <file of URLs/paths> [--out DIR] → DIR/<slug>/ each + index.md
# TikTok URL fails in yt-dlp (unreliable on TikTok since 8-14): fetch via tikwm, then pass the local mp4
cd ~/tt-creative-sourcer && python3 -c "import sourcer,downloader,sys; u=sys.argv[1]; d=sourcer.tikwm_get('/api/?url='+u+'&hd=1'); p=d.get('play',''); p=sourcer.TIKWM+p if p.startswith('/') else p; print(downloader.download(str(d.get('id')), u, p))" 'https://www.tiktok.com/@<handle>/video/<id>'
# 3b FRAMES + REVEAL: written by the dissector (built 10-06): frames/sNN_start.png + sNN_end.png per measured shot + frames/index.json
# (§7: read-only refs, never generation inputs); pacing.json product_reveal_pct (needs the Gemini beats; pass --product-keyword:
# on 01_skits Gemini tagged no beat role=product, the serum showed up only by keyword)
# 4-6 REMIX SHEET: write output/ad-dissect/<src-slug>/remix.md from references/beat-sheet.md
# measure OUR finished cut with the dissector's own cut filter (free, no Gemini):
ffmpeg -v info -nostats -i <final.mp4> -vf "select='gt(scene,0.22)',showinfo" -an -f null - 2>&1 | grep -c pts_time
# OWN SONG WINNER, style only (one variable): see format-song; Mode B for a winner that exists only as an MP4
python3 -m scripts.cartoon_h3.reskin --from-video <final.mp4> --script <lyrics.txt> --style <style> --slug <new-slug>
# 7-8 HAND OFF: invoke the target format-* skill with the remix sheet; its pack, gates and --spend rules apply
- Cost of this skill: one Gemini call per dissect (estimated ~$0.01-0.05 in diff_cloning.md; not measured) + Scribe minutes from EL quota. Production cost = the target format's.
- Time: dissect ~2-5 min per video; remix sheet ~20 min.
10. Gates & QA checklist
- [ ] Source has a receipt (our CPA/ROAS, TrendTrack run days/duplicates, Foreplay spend signal, or play count) written in the remix sheet.
- [ ] Source type classified per §5; lane-leader →
--competitor used and the sheet is a gap map only.
- [ ]
dissect.md + pacing.json exist; wps present or hand-counted and labelled.
- [ ] Keep/change table filled; nothing in "must change" survived (words, cast, set, claims, numbers).
- [ ] Concept formula: 4 slots sourced (structure / verbatim VOC line grep-checked / belief / buyer).
- [ ] ONE innovation named in
iteration:; parent named with CPA.
- [ ] Competitor-swap test written out (what only we can say).
- [ ] Core §1 doctrine: lines 1-2 name HER; stake on her, caused by the mornings; Fish's ruled lines verbatim; product facts from product-truth.md.
- [ ] Buyer-match answered; every source objection beat refilled with a ranked Dawn objection (or cut), none reworded.
- [ ] Pacing band set; vo_check keys cite pacing.json values; reveal position no earlier than the source's −10 points.
- [ ] Routed to one format-* skill; its gates + core §4 gates run from there (Fish approves script before any paid step).
- [ ] No third-party footage, face, voice, logo or set used in our ad. AI disclosure follows platform rules.
11. Variants & test plan
- Own winner → new format/style: ad set vs the winner (one variable: format port or style). Read CPA at 7 days against the parent.
- Non-competitor / organic remix: an explore (concept-formula rule 4: a format with no paying ad on the account). Own ad set in Testing CBO, parent = the closest paying Dawn ad in the target format. Read at 7 days.
- Pure mirror vs 80/20 remix is itself a test: the 10-01 pure mirrors read on 10-08. If they lose, the next clone of the same sources is an 80/20 remix (source structure + our paying body's lines), not another pure mirror.
- Swap passes when a remix changes cast, voice and product: one per pass in that order (actor → voice → product), checked between passes. On Meta, one variable per ad set (core §6).
- Several clones of ONE source in one ad set read as near-duplicates to the auction (charswap: 24 of 25 ads edited one source video, 4 of 28 got delivery). Spread sources or give each its own ad set.
12. Failure modes
- Mirroring the lane leader (Kalda 10-05: soothefy natives beat for beat). Fix: reclassify as gap map, rebuild slot 1 from our paying structure or a non-competitor scaler.
- Two innovations in one remix (new hook + new style): the read means nothing. Split into two packs.
- Source stake doesn't land on her: the remix keeps a kid-stake or no stake. Fix: add the mornings-caused stake on HER; college/kid money is banned.
- Stale product facts from an old pack: the 10-01 mirror packs say "no screen… nothing on top of the strap"; product-truth.md says a white LED time display, dark when idle. Copy facts from product-truth.md, never from an old pack.
- yt-dlp fails on TikTok: tikwm fallback (§9). Foreplay URL with no
<video> found: open it in agent-browser, grab the mp4, pass the file.
- pacing.json wps missing (no Scribe key or
--no-scribe): don't guess; hand-count from the dissect or rerun.
- Gemini over-reads tools (Midjourney/Runway guesses from stale training data):
production.likely_tools is a style hint, not fact (REPORT §3).
- Dissect paraphrase drifts into the source's wording: the prompt caps quotes at 8 consecutive words; our script still gets written from VOC, never from
said.
- Matching a cut rate the lane can't hit: state the band you drop instead of forcing sub-1.2 s beats.
Not built yet (needs Fish's go)
- TikTok Shop GMV ranking (FastMoss/Kalodata): no tool or account. Proxy = tikwm
play_count/digg_count; for Meta, TrendTrack longestRunning/duplicates.
- Cheap video-to-video product/actor swap lane: none live. Precedent
scripts/charswap_*.py (Seedance 2.5 video-edit on the Higgsfield unlimited entitlement, ended 9-09); fal reference-to-video refuses realistic faces. If built: replace person AND set, reference only footage we own or license, never a competitor's ad, never product-swap-only on someone else's footage.
ad_dissector.py isn't wired into cartoon_brief_builder.py (the --reference-url idea in diff_cloning.md wasn't built). Pacing-only, batch, frames/ and reveal % shipped 10-06.
- No automated competitor-swap test. No static-ad dissector (statics route to dawn-statics templates by hand).
Don't adopt (davidaistar)
- Racial/ethnic actor-swap prompts ("make the couple a black couple… make the voice sound…"). Change one variable at a time; demographic ventriloquism is out.
- Grey-hat clones: someone else's footage with only the product swapped.
- His AI-disclosure posture (skip flags on a disposable account). We follow platform rules.
13. Sources
~/research/davidaistar/REPORT.md, analysis/diff_cloning.md, analysis/gemini_{HBIENgQIQVU,bw1LPGZWf-k,gpzy2ofG0Dw,aqo2L5wYGEg}.md, analysis/guide_copy_images_shorts.md; scripts/ad_dissector.py, scripts/cartoon_h3/{reskin,vo_check,storyboard,readout}.py; output/dawn-beauty-format-2026-10-01/{SCRIPTS-v4-mirror.md,build_packs_v4.py}, output/concept-packs/*mirror-2026-10-01.md; knowledge/concept-formula.md; memory corrections-hot.md, feedback_ad_concept_formula.md, reference_trendtrack_api.md, project_tt_creative_sourcer.md, project_launch_2026-10-01_beauty_format_cartoons.md; scripts/charswap_source_refs.py; ~/.claude/skills/competitive-ads-extractor/SKILL.md (generic, no script behind it; use this skill instead). Details in references/sources.md.
Not built yet (needs Fish's go)
Every line in this skill that mentions something not built, roughly de-duplicated. Some items repeat in different words.
- Not built yet (needs Fish's go)
- gpzy2ofG0Dw, TikTok Shop duplication (gemini_gpzy2ofG0Dw.md). Reference ad, paraphrased beat by beat: a 44 s dim selfie video in a bedroom; 0-3 s a couple asks on camera and in text whether the product can knock them out within the hour; a
- Shorts (guide_copy_images_shorts.md): FuoDO-SVwNM (FastMoss competitor spy, sort by GMV: not built here); XPKJZKm5VnU (the actor's energy has to match the script's arc or the payoff breaks: applies to cast choice); BHmPSaROT7c (racial actor