From mainbranch
Creates ads, copy, image prompts, video scripts, creative variations, and reviews compliance and launch plans. For full campaigns, copy-only, video, or Meta ad account checks.
How this skill is triggered — by the user, by Claude, or both
Slash command
/mainbranch:mb-adsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create ads, generate creative variations, review for compliance, and check ad account performance.
Create ads, generate creative variations, review for compliance, and check ad account performance.
CLI facts first: Find the business repo, run mb status --json --peek,
then use status readiness, drift, integrations, measurement, and ranked actions
before scoring creative depth or asking setup/provider questions.
Engine source workflow: workflows/mb-ads/workflow.md. This skill is the
Claude Code shell over that source. Preserve the shared source's fact-first
routing, launch-plan boundaries, provider gates, and read/write rules.
Shared source required mb commands:
mb status --json --peekmb start --jsonmb doctor repair --planmb connect doctor --jsonmb connect planmb site check "$SITE_REPO" --business-repo "$BUSINESS_REPO" --jsonmb validate --cross-refs --jsonmb checkpoint --plan --jsonShared source required JSON fact paths:
money_pathmoney_path.objects.proof.qualitymoney_path.objects.cta_pathmoney_path.objects.channel_strategymoney_path.objects.active_pushvalidation.file_contractscontent_strategycontent_strategy.overall_statecontent_strategy.simple_entry_pointcontent_strategy.layersranked_actionsupdatereadinessdrift.itemsintegrationsmeasurementmeasurement.availablemeasurement.statemeasurement.facts.expected_eventsmeasurement.blocked_countmeasurement.manual_countrelationship_health.gapscheckpoint.pendingcheckpoint.pending.blockersruntime.codex_cliruntime.claude_codestateblockedmanualevidencefacts.expected_eventsfacts.provider_statesourcechild_descriptorShared source gates: updates_repairs_migrations, file_writes,
checkpoint, provider_mutation, publishing_or_spend, customer_contact,
private_data, destructive_operations, structured_collection,
public_issue_or_proposal, account_change, upload_assets,
budget_change, campaign_publish, conversion_upload, gtm_publish.
Shared public/private boundaries: no_secrets, no_raw_provider_exports,
no_raw_transcripts, no_customer_member_data,
no_private_runtime_settings, no_private_dms_or_gated_communities,
no_raw_finance_legal_records, no_oauth_tokens, no_conversion_uploads,
no_account_identifiers_in_public_examples.
Shared modes: static, copy-only, image-only, hook-library, video-scripts,
long-form-video, review, launch-plan, check, or account-context.
These are the account-context modes and paid creative modes for this shared source.
Use this routing language exactly when needed: route to mb-think; route to mb-site.
Durable paid artifacts use
pushes/<YYYY-MM-DD-slug>/ads-batch-001.md, push playbook runs, research, or
decisions after approval. Google Ads Search uses the google-ads-search-launch
playbook source. Upload assets, provider mutation, spend, publishing, account
changes, GTM publishes, conversion uploads, and customer contact remain gated.
Codex support is read-only planning until runtime smoke proves more.
This skill writes new coordinated work to pushes/<YYYY-MM-DD-slug>/ (the
engine primitive). Examples below say "push" for the wrapping
record; this is the engine's word. If core/vocabulary.md defines a
display word — for example terms.push.singular: drop — speak the
operator's word ("drop") in conversation while still writing current
files (pushes/..., type: push, linked_pushes). Never rename folders,
frontmatter, link fields, JSON keys, or commands based on vocabulary.
If the repo still has legacy campaigns/ records, preview the migration
before creating new push work:
mb doctor # confirms legacy campaigns/ drift
mb migrate campaigns --plan # read-only preview of moves
The word "campaign" elsewhere in this skill refers to Meta Ads campaigns (the provider's term for its object) — not the Main Branch primitive.
When creating push.md, include the validator-required frontmatter and fill
the values from repo truth or operator answers. When finished creative
already exists outside git (a Drive folder, an export), ask "where do the
finished files live?" and record media_location plus a media_backend
hint (google-drive, r2, local, mb-media):
---
type: push
slug: YYYY-MM-DD-slug
kind: launch
status: planned
health: unknown
goal: { metric: "", target: "", by: YYYY-MM-DD }
owner: ""
audience: ""
offer: core/offers/<offer>/offer.md
promise: ""
media_location: "" # optional — where binary creative lives
media_backend: "" # optional hint; requires media_location
---
If the push ties to a bet, decision, research file, playbook, or outcome,
add the typed frontmatter link (linked_bets, linked_decisions,
linked_research, linked_playbooks, linked_outcomes) and mirror it in
## Related links as Markdown relative links, or preview
mb doctor repair --plan and ask first. Use the connection matrix in
docs/business-connections.md; never infer links from body-only references.
When an ad-adjacent workflow needs a resource-delivery plan, provider setup
recipe, launch checklist, or external automation approval record, draft it
as pushes/<YYYY-MM-DD-slug>/playbooks/<playbook>.md with type: playbook
— plans and approval records only. Do not publish, schedule, DM, reply,
mutate ad accounts, or claim a provider is supported unless mb and a
shipped provider adapter prove that path with docs, tests, approval gates,
and smoke evidence.
Before triage, find the business repo, read deterministic Main Branch
facts, then score ad-specific reference depth only when needed. This
prevents generic ads from thin reference without duplicating repo-health or
provider checks that mb already owns.
NEVER search the filesystem. NEVER use Explore or Task agents to find repos. NEVER scan ~/Documents/GitHub/.
CWD-first: If current Main Branch markers exist in CWD, use it. If CWD looks like an old Main Branch repo, run mb status --json --peek and/or mb doctor repair --plan before saved config or discovery. Do not write to old repo structure.
If CWD is NOT a business repo, run:
mb status --json --peek
/mb-ads was invoked from /mb-start, the repo is already identified —
use it without asking.Always confirm the repo before proceeding. Never assume.
After confirming, run mb status --json --peek from that repo. Use
readiness, drift.items, integrations, measurement, and
ranked_actions as the source of truth for setup, stale context, GitHub,
provider readiness, and repair commands. Only run the direct scoring below
when status is unavailable or lacks the needed ad-specific detail.
When the request depends on a new, thin, or underperforming offer, load
.claude/reference/conversion/offer-sharpening.md before writing hooks or
launch-plan claims. Route to /mb-think when audience, outcome, mechanism,
proof, risk reversal, objections, reason to act, or next step is unclear.
NEVER spawn Explore or Task agents for pre-flight. Read files directly at the known repo path. Pre-flight should complete in under 10 seconds.
At the repo path, resolve offer context first with
.claude/reference/business-primitives/offer-bet-push-proof.md, then check
these files and count lines:
[resolved offer.md] → 0 (missing), 1 (<20 lines), 2 (20-80), 3 (80+)
[resolved audience.md] → same scoring
core/voice.md → same scoring
core/proof/testimonials.md → same scoring
core/proof/angles/*.md → count .md files EXCLUDING README.md: 0=0, 1=1, 2-3=2, 4+=3
core/brand/visual-style.md → same scoring (optional)
In multi-offer mode, score the offer-specific offer.md and audience.md (resolved via path resolution), not the brand-level core/offer.md.
Composite = sum of all 6 scores (max 18).
| Composite | Status | Action |
|---|---|---|
| 12-18 | GREEN | Proceed to triage |
| 8-11 | YELLOW | Warn user, show gaps, allow override |
| 4-7 | RED | Route to /mb-think with enrichment targets |
| 0-3 | BLOCKED | Route to /mb-setup |
Display the readiness report, then proceed. See references/preflight-algorithm.md for gap guidance and smart mix recommendations.
For Facebook image-ad generation, load the MAIN-374 decision and
references/image-generation-workflow.md
for ad readiness, source bites, playbook routing, review boards, and
image-index.md.
mb connect doctor --json
Use status/connect facts first for Google/Workspace readiness. For provider rail
smokes, use mb image smoke-openai --repo "$BUSINESS_REPO" --json (default rail) or mb image smoke-fal (explicitly selected fal.ai rail); see references/image-generation-workflow.md
for the --generate, credential, media-storage, and image-index.md boundary.
Never ask the operator to paste API keys into chat or public issue text.
If this ad work is for Google Ads, paid traffic to a site/minisite/lander, retargeting, or any request that asks whether a campaign is ready to launch, check measurement readiness before saying "launch."
docs/google-ads-gtm-conversion-rubric.md.mb connect plan or mb connect doctor --json from the business repo when provider readiness matters.mb site check "$SITE_REPO" --business-repo "$BUSINESS_REPO" --json
Use the returned state:
blocked: do not recommend launch; list the blocked checks and exact next command/manual step.ready_for_preview: ads can be drafted, but traffic should not launch; tell the operator to run GTM Preview/Tag Assistant and finish provider metadata/approvals.ready_for_operator_review: ads can be prepared for review, but launch still needs explicit operator approval for GTM publication, conversion actions, consent posture, budget, billing, and spend.ready: local readiness checks passed, but do not mutate accounts or launch campaigns.Do not invent ready_for_launch or treat ready as campaign launch permission. Main Branch can prepare and review; the operator launches manually.
Never ask the operator to paste Google Ads/GTM tokens, OAuth secrets, conversion uploads, or customer data into chat. Quote mb connect repair commands instead.
Check Meta ad account access only when the user's request needs live ad account context. Do not duplicate provider setup or health checks in prose.
1. Read `mb status --json --peek` → integrations/providers/measurement facts.
2. If the operator needs setup choices, run `mb connect plan`.
3. If something looks broken, run `mb connect doctor --json`.
4. If `mb` says Meta Ads account context is `ready`, ask whether to pull a
compact read-only account summary before generating.
5. Never block generation on missing ad account access.
Graceful degradation: If Meta Ads account context is not ready, mention
the optional account context once, quote the mb repair command when useful,
then continue from repo reference files, exported screenshots, or manual Ads
Manager notes.
Describe the capability: connecting a Meta ad account, pulling a compact
read-only account summary, or auditing active campaigns. Keep status
capability-first and do not name connector vendor details. If the user asks,
offer mb connect plan or continuing from reference files.
Detect what the user wants from natural language. Route internally to the right component pipeline. See references/entry-points.md for the complete entry point detection table and component composition.
| User Says | Entry Point | What Happens |
|---|---|---|
| "static ads", "full from scratch", "image ads" | Full Pipeline | Copy + compliance + images (classic flow) |
| "I already have images, just need copy" | Copy Only | Skip image gen, primaries + headlines |
| "Just need images for existing copy" | Image Only | Image prompts and optional provider generation |
| "creative variations", "hook library", "one-liners", "50 hooks" | Hook Library | Bulk creative variations (flexible quantity) |
| "video scripts", "ad scripts", "spoken word" | Video Scripts | Spoken-word script pipeline |
| "video ad script", "turn this offer into a video ad", "paid sales video", "long-form video ad", "VSL-style paid creative" | Long-Form Video Ads | Load references/long-form-video-ads.md |
| "I'm repurposing a video", "I shot a video" | Video Repurpose | Transcribe + extract hooks + copy variants |
| "I want ideas for an ad", "brainstorm" | Ideation | Account check (if available) + concept generation |
| "research winning ads", "mine reviews", "analyze competitors first" | Research / Mining | Route to /mb-think winning-ad research before generation |
| "launch ads", "paid traffic plan", "Google Ads launch", "$X/day for Y days" | Launch Plan | Provider-safe plan/check mode, no account mutation |
| "check launch", "how are ads doing", "continue or kill" | Launch Check | Read status/outcomes/operator exports, recommend continue/change/stop |
| "Check my ad performance", "what's working" | Account Check | Read-only Meta Ads context if mb connect and runtime tools are ready |
| "Give me 5 variations of this winning ad" | Performance Iteration | Pull winner + generate variants if account context is ready |
| "What's working before we create?" | Pre-Gen Account Check | Account overview + creative audit if account context is ready |
| "review", "audit", "compliance check" | Review | 6-lens compliance review |
Also accepts: "static", "static ads", "video", "video scripts", "one-liners", "review" -- these route to the same pipelines.
If unclear, ask: "What do you have and what do you need? (e.g., 'I have images, just need copy' or 'full from scratch')"
If research/mining is requested before generation: Route to /mb-think and
load mb-think/references/winning-ad-research.md. Customer language, review
mining, competitor gap maps, comment mining, and winning script teardown should
save to research/ and codify into core/ before this skill generates ads.
Do not paste raw review/comment dumps or copied prompt libraries into ad output.
If the selected research file has brief_format: grok-8, use its downstream
handoff first: business/offering for the promise, ICP for hooks, journey for
funnel stage, competitive landscape for differentiation, brand story for voice,
content/assets for proof and creative inputs, and metrics/constraints for the
review bar. If the brief names a resource-delivery or provider workflow, draft
or update a push playbook as a plan only; do not execute provider mutation.
If launch/check is requested for paid traffic: Load references/launch-plan-check.md. Prepare campaign materials, policy findings, measurement readiness, manual provider steps, and approval records; do not mutate ad accounts or start spend.
If mb status --json --peek / mb connect doctor --json reports Meta Ads
ready and the current runtime exposes the read-only ad account tools:
Before generating: Ask before pulling live account context:
"Meta appears connected for read-only checks. Do you want me to pull a compact account summary before making recommendations?"
If user says yes, run Account Check component (see references/meta-ads-integration.md):
If user says no, proceed to generation with reference files only.
After generating: If the operator approved a read-only summary, use it to frame next steps without exposing raw account data or implying account mutation.
Account awareness is currently read-only. Write operations are on the roadmap and require explicit operator approval gates -- see references/meta-ads-integration.md.
Before generating any ads, ask:
"Will this campaign run as a Meta Special Ad Category? (Housing, Employment, Credit, or Social Issues/Politics)"
If Employment (job training, career coaching, hiring, job boards):
special_ad_category: employment to frontmatterFor Employment, avoid any assertion about current status such as job, salary, employment state, job-seeking status, or dissatisfaction. Use aspirational framing only.
Before loading reference files, resolve active offer context with
.claude/reference/business-primitives/offer-bet-push-proof.md and the
file list in references/preflight-algorithm.md.
Use current core/ paths first; treat old paths as migration input only.
Before outcome-claim or substantiation recommendations, read
money_path.objects.proof.quality. If quality.public_marketing.status is
blocked, do not draft proof-backed public ad claims; route to /mb-think for
permission collection before ads, pages, or public claims use that proof.
If content strategy layers or Skool surface notes exist, use them to decide the paid role and keep ads congruent with visible offer, pricing, and proof. Angles are additive; mix established angles with any newly codified ones.
Create campaign batches with image prompts + ad copy. Each batch = 5-6 angles, each angle = 3 image creatives (graphic, lo-fi, interrupt). Hook = 123-135 chars, no questions, no "you/your" in first 3 lines, no emojis. 5 ad styles (Deep, UGC, DR, Pattern Interrupt, Testimonial). Format pair: 1:1 + 9:16.
See references/mode-static-ads.md for the full workflow: campaign structure, hook formulas, copywriting batch sequence, ad styles by length, image prompt types, and the file save convention.
Generate punchy, truly diversified creative variations for static image ads (Andromeda-optimized). Users can request any quantity. Also called "one-liners" — same methodology, same pipeline.
The core rule: Every variation must include at least one specific anchor (role, niche pain, value prop, or proof point). The Specificity Test: if it could sell a gym membership, it fails.
See references/mode-hook-library.md for the full 6-step process, anchor rule, input modes, output file format with full generation context, and links to one-liner-methodology.md / one-liner-examples.md.
Create diverse spoken-word scripts for camera delivery. 15-30 scripts across 3-4 buyer avatars, ~5th grade reading level, contractions, fragments. Each ad = a fundamentally different reason to buy.
See references/mode-video-scripts.md for the 6-step process, script structure (Hook / Body / CTA), spoken delivery optimization, and save convention.
For long-form paid sales videos, video ad scripts that need VSL structure, or VSL-style paid creative, load references/long-form-video-ads.md.
Review ads through 6 compliance and quality lenses before shipping (FTC, Meta Policy, Copy Quality, Visual Standards, Voice Authenticity, Substantiation). Spawns 6 parallel Task agents (read-only), synthesizes a unified P1/P2/P3 report, presents proposed P2/P3 copy changes as a diff, and applies them only after explicit approval.
See references/mode-review.md for the full lens table, review process, severity levels, and status determination.
Every generation entry point (Full Pipeline, Copy Only, Hook Library, Video Scripts) runs this pipeline automatically after saving output. Do not ask the user whether to run compliance review -- it is automatic.
See references/post-generation-pipeline.md for the complete pipeline: checkpoint pre-review, lens tier selection, optional image-provider check, parallel agent spawning (compliance + image), synthesis, proposed-change approval gate, unified report, and post-review checkpoint.
Quick summary: Save a checkpoint for the pre-review state after operator approval, spawn 5-6 compliance agents + optional image agents in parallel, synthesize P1/P2/P3 findings, surface P1 to user, show proposed P2/P3 copy edits as a dry-run diff, apply copy edits only after explicit approval, present unified report, and offer a post-review checkpoint.
"While You Wait" pattern: When spawning parallel agents that take >30 seconds, show a brief note so the user knows what's happening:
"Running compliance review across 6 lenses + generating images in parallel. This takes about 2-3 minutes. These run as sub-agents so they won't eat into your session context."
Never say:
Safe to say:
Before saving any batch, verify:
| Check | Requirement |
|---|---|
| Anchor specificity | Every hook/variation has at least one offer-specific anchor |
| Cold traffic language | No insider jargon — would a stranger understand in 3 seconds? |
| Hook length | 123-135 characters for static ad hooks |
| No questions | Hooks don't start with yes/no questions |
| No you/your | First 3 lines avoid direct address |
| Angle diversity | Each concept uses a genuinely different psychological entry point |
| Voice match | Copy matches voice.md tone (if available) |
| Compliance | No banned claims, proper testimonial attribution |
| Skool congruence | Claims match live about page + pricing cards (if skool-surfaces.md exists) |
| Save-ability | Would someone save this ad to reference later? Educational, actionable hooks drive purchase intent |
| Enemy framing | Does at least one concept use a named enemy from voice.md? Enemy-driven contrast creates identity alignment |
If context was compacted mid-task, check:
mb JSON active-offer field if present; otherwise ask the user to restore offer context. Do not silently route from .vip/local.yaml.pushes/ for partial work. If old campaigns/ records exist, run mb migrate campaigns --plan before relying on them.mb status --json --peek; if needed, run mb connect doctor --jsonFor full pipeline: Did we finish image prompts (Part 1) before copy (Part 2)? For hook library: How many variations generated out of requested quantity? For video: How many of 15-30 scripts are done?
Full/static: 5-6 concepts x 5 primaries x 5 headlines x 3 image prompts. Hook/video/review: default 30 hooks, 15-30 scripts, or 6-lens P1/P2/P3 review. Account/launch: read-only Meta summary or provider-safe paid plan/check; no account mutation without shipped adapter and explicit approval.
npx claudepluginhub noontide-co/mainbranch --plugin mainbranchWrites 6 ad copy variants across 3 funnel stages (TOFU/MOFU/BOFU) with platform-specific CTAs, ad policy compliance, and pain/aspiration/FOMO triggers.
Provides guidance on paid advertising campaigns across Google Ads, Meta, LinkedIn, Twitter/X, and TikTok. Covers campaign strategy, audience targeting, bidding, and optimization.
Audits cross-platform ad creatives for copy, video, images, format diversity, fatigue, platform compliance, brand consistency, and production priorities. Collects brand context from websites if missing.