Three runs take a client from "we have a website" to finished Meta ad creative.
Each run hands one file to the next — you never retype client info. Go live with what the client
approves. (An optional extra round exists if you'd rather remake rejected ads than wait for
the next refresh — it's at the bottom, and most runs won't need it.)
Attached is codex-skills.zip. It contains updated versions of two skills I already use: brand-standards (v4.0) and meta-ad-creative-generator (v4.1). Please:
1. Back up my current versions of both skills, if I have them.
2. Install the attached versions into my Codex skills folder, keeping the folder structure exactly as it is inside the zip (brand-standards/ and meta-ad-creative-generator/, each with its SKILL.md and subfolders).
3. Confirm both skills are installed and show me the version number from each SKILL.md.
Do not rewrite or summarize the skill files — install them as-is.
Then type $ in a new chat — both skills should be listed. First time only: ask Codex where to put your OpenAI API key for the ad generator.
Attached is the updated SKILL.md for a skill called creative-strategy (v4.3). Please update my creative-strategy skill with this file exactly as written — do not rewrite, shorten, or reformat it. If I don't have a creative-strategy skill yet, create it from this file. Show me the review card so I can save it.
A card appears in the chat — click Save. After that /creative-strategy works in any Cowork chat.
The golden rule for attachments: each run hands one file to the next.
The file carries the client context, so nothing is typed twice.
Run
App
You type
You attach
You get back
1
Codex
$brand-standards
nothing
<Client>-Brand-Standards.md
2
Claude Cowork
/creative-strategy
the Brand-Standards .md
<Client>-Creative-Package.md
3
Codex
$meta-ad-creative-generator
the Creative-Package .md (only that one)
review-ready ads + <Client>-Ad-Index.md
Optional — remaking rejected ads. Not part of the normal workflow. The default
after a client review is to go live with what they approved and build a whole new set at the next
creative refresh. Use these two extra runs only if you want to keep some of this round's copy or
artwork and remake just the rejected ads.
Revision
App
You type
You attach
You get back
Run 2 again
Claude Cowork
/creative-strategy replace
the Creative-Package .md — then tell it which ads were rejected, in plain words
the same package, round 2 — approved ads preserved, rejected ones replaced
Run 3 again
Codex
$meta-ad-creative-generator
the round-2 Creative-Package .md
only the new, revised, or corrected ads
1 Research the brand Codex
Open the Codex app. Start a new chat. Attach nothing.
Type $ and pick brand-standards.
It asks for what it can't find — answer in one message: the business name (exactly as
you want it spelled on folders and files), the client's website, and any extra
sources one per line (Facebook, Instagram, Google Business Profile, Yelp — or "none").
Don't tell it the industry; it works that out from the site.
It asks where the client folder should live. Point it at the folder
where you keep this client's work, or let it create one (Mac or Windows — any path works).
Everything for this client lands there: the .md files, assets, work files, and finished ads.
If the folder already had artwork in it, it asks before organizing anything.
It asks: Scan your Google Drive for client assets? On Yes it looks for
<Client Name> Creative Folder and downloads usable ad assets only —
common image types, plus videos up to 100 MB each. Audio and project files never come
down. Over 1 GB of qualifying files, it asks first. It tells you what actually arrived
versus what it only saw listed.
It researches and writes <Client>-Brand-Standards.md into
brand/. Every rule is tagged by how much weight it carries — a client
requirement, a verified fact, observed website styling, or a recommendation — so a
weak website doesn't become the ceiling for the ads. It also grades each asset: usable as-is,
needs enhancement, identity reference, or missing.
Optional: a brand tile in brand/, marked reference until you
approve it. A missing tile never stops production; the real logo file and written color
values always outrank it.
Before Run 2 — put your assets in. Drop the client's photos, logo, and
any files you have into the client folder's assets/ subfolders. If you have ads the
client already loves or hated, drop them into brand/benchmarks/approved/ or
rejected/ — Run 3 judges its renders against them. Run 2 builds the strategy around
what's actually in there.
2 Build the strategy Claude Cowork
Open the client's Project first — not a blank chat. Inside the Project,
the skill reads your meeting transcripts and call summaries, so the strategy reflects what
the owner actually said they want, not just what the website says.
Start a new chat in that Project. Attach
<Client>-Brand-Standards.md and type
/creative-strategy.
If a permission box pops up on your desktop asking to access your client folder —
approve it. That's how it reads your assets and saves the output back. It asks once.
It asks for anything it couldn't find on its own — usually the offer — plus three questions
it asks every time:
1. Concepts per bucket — 5 or 10? (or type a number)
Reserve ideas per bucket — 2 or 3? (or a number, or 0)
2. Seasonality — do we have any seasonality needs for this sprint?
(run dates, a season to lean into, a promo window, or "none")
3. Visual benchmarks — any ads you want this set to look like, or ads
the client rejected, that aren't already in brand/benchmarks/?
Your number is the ceiling, not a quota — a concept it can't defend gets cut, not padded.
Say "none" to seasonality and it builds evergreen.
The bucket gate — your decision point. It shows the client's full
service menu, marks which services the proposed ad buckets cover and which they
don't, then proposes 5–8 buckets ranked with reasons.
Read the ✕ not-covered list first — that's where a whole revenue line gets caught
before it's skipped. Then answer: build these, cut, add, swap, reorder, or change the count.
Whatever you approve is the entire scope of the ads.
Only if some approved buckets have thin or weak assets: it asks whether real photos
are still coming, whether to enhance what's there (lighting, perspective,
background cleanup, extension) and generate scenes where nothing usable exists, or whether
to plan fully AI-generated imagery. The answer is a summary — the real instruction is the
per-concept asset plan it writes next. AI never fakes proof: no client trucks, uniforms,
signage, staff, or testimonial imagery, and the logo always has to be a real file.
It writes the concepts — at your count per bucket. Each one carries a visual
idea (what stops the scroll and what the image says), how the image proves the headline,
why it fits this client, the copy with character counts, CTA, destination, and a four-line
asset plan: Keep real / Enhance / Generate / Must accomplish. Layout is a suggestion at
most — Codex decides the execution. Each bucket also gets a short reserve of alternate
ideas, marked not for production, held for the replacement round.
It delivers <Client>-Creative-Package.md (also saved to brand/).
Section 4 is the resolved production brief — the rules that actually
govern this run, each tagged as client-approved, strategist-approved, verified fact,
recommendation, or unresolved. The original brand standards ride along as Appendix A.
3 Make the ads Codex
Open Codex. New chat. Attach <Client>-Creative-Package.md
— just that one file. Type $ and pick
meta-ad-creative-generator.
It reads the package's build list, re-scans the client folder, and actually
opens the source photos, logo, and any benchmarks — not just their filenames. It tells you
what changed since Run 2.
It asks the CTA button question once — how many ads get a button-style
CTA drawn on the artwork: None / 25% / 50% / 100% / Other. When in doubt, say
None. It never re-asks a settled answer.
For each concept it writes a short execution brief — the visual idea,
the hero subject, the composition, which assets stay real and which get enhanced or generated,
and the specific failure to avoid — then renders. It picks a route per ad: a fully generated
master, or AI imagery finished with the real logo file and real fonts for exact type.
First look — your decision point. For a new direction it builds
up to three concepts, usually two candidates each, and runs them through its own visual
gate first: full size and phone size, checking idea, composition, typography, brand fidelity,
and finish. You only see what passed. Pick the direction, or say what's wrong — it gets two
focused repair rounds per concept before it has to tell you the direction isn't working.
After you approve the direction it builds the rest of the build list
in batches of five, pausing after each batch. The list defines the total —
there's no automatic 45-ad target and reserves are never built.
Ads land in the client folder, plus <Client>-Ad-Index.md — every ad with
its copy, computed character counts, CTA, destination, sources, settings, and status.
Review-ready means it passed Codex's visual gate; approved means you or the
client said so. Use the index when you upload to Ads Manager.
↻ Optional — remaking rejected ads Claude Cowork → Codex
You can skip this entirely. After the client reviews the ads, the normal
path is: go live with what they approved, and build a completely new set at the next creative
refresh. If they approve 30 of 50, you launch 30. Use the steps below only when you want to keep
some of this round's ideas, copy, or artwork and remake just the rejected ads as new options.
In the client's Project, attach <Client>-Creative-Package.md and type
/creative-strategy replace.
It asks which ads the client rejected and what they said. Answer in plain
words — the filename, the headline on the ad, "the two testimonial ones," whatever is
easiest. No ID numbers needed; it matches them for you.
Confirm the table. It shows each rejected ad, what it matched it
to, and what it proposes: replace (wrong idea — a new one), revise (good idea,
weak render — rebuild it), or correct (a wrong word, price, logo, or crop — fix that
only). Change any row, then say go. Approved ads are never touched.
Take the round-2 package to Codex and run $meta-ad-creative-generator
on it. It builds only the ads that changed and saves them separately — approved originals
stay exactly as they were.
! Common mistakes
Attaching the wrong file to Run 3. Run 3 takes the Creative Package (Run 2's
output), not the Brand Standards file — the package already contains the brand standards
inside it.
Running Run 2 in a blank chat instead of the client's Project — it works, but the
strategy loses everything from your meeting notes.
Skipping the assets step between Runs 1 and 2 — the strategy then leans on website
photos instead of the good client photos sitting on your drive.
Rubber-stamping the bucket gate. The bucket list always looks reasonable. The ✕ list
is where the mistakes hide.
Asking for 10 per bucket out of habit. Five strong concepts plus a reserve beats ten
you'll cut later — and replacements come from the reserve, not a new strategy run.
Hand-editing a rejected ad. Either let it go and build fresh next refresh, or use
/creative-strategy replace — that way the copy and the approved originals stay
intact and traceable.
Calling a render "approved" because it looks fine. Codex's gate makes it
review-ready. Approved is what you or the client say after looking at it.
★ Cheat sheet
RUN 1 Codex $brand-standards attach NOTHING
→ answer: name, website, sources → confirm folder → Drive scan Y/N
→ get Brand-Standards.md → drop assets into assets/ (+ benchmarks/ if you have them)
RUN 2 Cowork /creative-strategy attach BRAND-STANDARDS.md (in client Project!)
→ approve folder popup → answer: count per bucket, seasonality, benchmarks
→ APPROVE THE BUCKETS ← your big decision
→ get Creative-Package.md (visual idea + asset plan per concept, reserve per bucket)
RUN 3 Codex $meta-ad-creative-generator attach CREATIVE-PACKAGE.md only
→ CTA buttons? (None is fine)
→ FIRST LOOK: up to 3 concepts × 2 candidates, already through Codex's visual gate
→ approve the direction → rest of the build list in batches of 5 → Ad-Index.md
THEN client reviews → approved ads go LIVE → new set at next refresh. Done.
OPTIONAL only if you want to remake the rejected ads instead of waiting for next refresh:
Cowork /creative-strategy replace attach CREATIVE-PACKAGE.md, describe rejected ads in plain words
→ confirm replace / revise / correct per ad → round-2 package
Codex $meta-ad-creative-generator → builds only what changed; approved originals untouched
Δ Changelog what changed and why
Skill
Current version
Installed
$brand-standards (Codex)
4.0
2026-09-11
/creative-strategy (Claude Cowork)
4.3
2026-09-11
$meta-ad-creative-generator (Codex)
4.1
2026-09-11
drive_social_handoff
v1 out of Run 1 · v2 out of Run 2
2026-09-11
v4 "Ideas, not templates" 2026-09-11
Why. The v3 skills produced visually different ads without producing
better ads. Run 2 was assigning layouts — format families, color modes, rotation quotas, a
mandatory no-photo card per bucket — and Run 3 was executing them, so weak design decisions were
specified upstream and rendered faithfully downstream. A Codex self-audit and a Claude review
reached the same diagnosis. v4 moves visual decisions to the step that can see the pixels, gives
every concept a visual idea instead of a layout, and adds a real visual-review gate before anything
is presented. The workflow also changes shape: the client approves or rejects rendered ads, approved
ads go live, and rejected ones are remade as new options — per-ad editing is retired.
/creative-strategy — v3 → v4.3 (Claude Cowork)
Added
Concept count asked every run — "5 or 10? (or type a number)" plus a reserve count. A ceiling, not a quota.
Visual idea per concept:Visual idea, Message–image relationship, Why this client. A layout description no longer counts as a concept.
Per-concept asset plan — Keep real / Enhance / Generate / Must accomplish — replaces the bucket-level asset mode as the operative instruction.
Section 4: Resolved production brief. Every governing rule tagged client-approved requirement, strategist-approved direction, verified fact, proposed recommendation, or unresolved question. Overrides quote the Appendix A rule they supersede.
Reserve ideas per bucket, marked not authorized for production, held for replacements.
Replacement round (/creative-strategy replace): rejections classified as replace / revise / correct, proposed then confirmed; approved concepts marked preserve and verified unchanged by diff against an archived copy.
Visual benchmarks in brand/benchmarks/approved/ and rejected/; the first client review establishes them when none exist.
Rejection scope — execution, concept, campaign, or brand; only the last two become restrictions.
Explicit restrictions as a separate mandatory list with source, date, and scope, distinct from suggested treatments.
Standing bucket rules folded in: hero-product businesses, restaurants by occasion, shared-menu multi-location clients, both tonal registers by default, outside research as creative substance, no "vibes" in copy.
Handoff upgraded to drive_social_handoff: v2: round, counts, benchmarks, suggested_treatments, restricted_treatments, and the build / preserve / revise / correct lists (IDs always quoted).
Removed
"Resolve everything here" — layout is now Run 3's decision.
The variation matrix, rotation rules, family census, and required format family / color mode / headline device / photo treatment fields. The vocabulary survives only as an optional, provisional Suggested execution line.
The two-no-photo-concepts-per-bucket quota; the GEN- plate brief table; the treatment-rotation table; the fixed 10-per-bucket default.
Changed
brand_tile optional with an approved / reference status; people_policy asked, never assumed.
v3 permitted_families / permitted_color_modes read as suggested vocabulary only; real prohibitions move to restricted_treatments.
Appendix A stays verbatim for traceability but Section 4 governs.
Tone: both registers by default unless audience, subject, or an approved direction calls for one.
v4.1 (same day): quoted YAML IDs, rejection scope, contextual tone rule, and preserve defined as a status-line change only — Codex's four compatibility refinements.
v4.2 (same day): the replacement round is explicitly optional — the default after a client review is to go live with approved ads and build fresh next refresh. Rejected ads are described in plain words (filename, headline, "the testimonial ones"); the skill matches them to concepts and confirms in a table. Every prompt now states what it needs, why, and an example answer, for team members running the skill. Client-provided assets are always approved for use, people in them or not — people_policy governs AI-generated people only.
v4.3 (same day): all folder references made system-agnostic for Mac and Windows team members — the client folder is whatever the strategist points the skills at; no built-in default path.
$brand-standards — v3 → v4.0 (Codex)
Added
Six-way evidence classification, including observed website styling as its own class — the website is a source, not a ceiling.
Asset inventory with condition: usable-as-is, enhancement candidate, identity reference, or missing, with Keep real / Enhance / Generate / Must accomplish principles for Run 2.
suggested_treatments and sourced, scoped restricted_treatments in the v1 handoff; optional brand/benchmarks/ folders.
references/asset-intake.md — Drive scan and download rules moved out of the main skill.
Removed
Industry-to-font templates, fixed color area percentages, "exactly one accent," family rotation, compulsory no-photo cards, blanket bans on effects.
permitted_families / permitted_color_modes for new guides; the mandatory brand tile and required brand-board prompts (both optional now).
Changed
A rejected render is a specific execution failure, not a universal ban.
The guide never selects production concepts, sets counts, or emits action lists — Run 2 owns those. Handoff stays at v1.
$meta-ad-creative-generator — v3 → v4.1 (Codex)
Added
Visual gate before presentation: every master opened at full size and ~360 px; five checks (idea, composition, typography, brand and fidelity, finish) recorded pass / revise / blocked with evidence. Technical validity, creative review, and client approval are separate statuses.
Execution brief per concept before rendering; suggestions from Run 2 are evaluated, not obeyed.
Handoff v2 routing — build / preserve / revise / correct honored as disjoint lists; reserves and preserved concepts fail before any API call. New scripts/handoff_contract.py; scripts/test_workflow.py with 33 offline regression tests.
Protected originals via preserved-files.json hash inventory, checked before and after execution.
Two production routes, both gated: a fully generated master, or AI imagery finished deterministically with the original logo, licensed fonts, and editable layout tools (prohibited in v3).
Reliable resume: sidecar receipts fingerprint prompt, ordered sources and contents, model, quality, size, and candidate count; resume requires a match plus decoded dimensions and SHA-256. Changed jobs need new filenames or revision directories.
v4.1 renderer: default gpt-image-2.5-sunburst at quality: high (xhigh / max for specific unmet needs). gpt-image-2 and Flare stay explicit overrides, never silent fallbacks.
Bounded exploration: up to three concepts × two candidates for a new direction, two repair rounds per concept, batches of at most five.
Removed
Stage A whole-campaign background approval before any ad is built.
The single-ad smoke test as the sole gate; the 45-ad default; 32% band / 42% panel geometry; five-family minimum; big-type quota; asset-reuse cap; universal effect bans; the ban on local compositing and finishing.
Changed
Similarity audit is advisory — a duplicate warning, never a taste score or redesign trigger.
Bucket asset_mode is a summary; the per-concept asset plan is operative.
Rejected benchmarks establish specific failures; approved benchmarks guide craft without copying claims.
v3 "Variety by layout" 2026-09-10 · superseded
/creative-strategy v3: format families, color modes, headline devices, photo treatments, a per-bucket variation matrix, rotation rules, and two no-photo concepts per bucket — the response to "ten ads look like one ad." Fixed the symptom, not the cause.
$brand-standards v3: brand tile, permitted_families, permitted_color_modes, people_policy added to the handoff.
$meta-ad-creative-generator v3: 4:5 masters at 1088×1360; per-job quality, candidates, photo_required; dry-run variety audit; new scripts/similarity_audit.py.
v22026-09-02 · the version this site previously described
Three-run pipeline with the single-file handoff, the bucket gate in Run 2, Stage A background approval and the one-ad smoke test in Run 3, 45 ads in batches of five.