---
name: meta-ads-brand
description: (formerly ugc-brand - old name still works as an alias) Stage 0 of the AI UGC Flow - deep-research a brand from its URL plus founder notes into the brand DNA every later stage builds on. Answers three questions with real research (site + Perplexity): who is this company, who exactly buys, and which pains does the product solve for that buyer. Produces profile.md, icp.md (with a Target Audience Language Profile), claims.md (verified claims only), and machine-readable profile.yml. Use when starting a new brand in the ad creative pipeline, when the user says "meta-ads-brand" or "brand DNA", or before running meta-ads-research for a brand with no brands/{slug}/ folder yet.
---

# meta-ads-brand: Brand DNA

Stage 0 of the AI UGC Flow. The creative engine must LEARN the company before it creates anything. This stage is pure understanding - three questions, answered with research, not guesses:

1. **Who is this company?** What the product actually does, how it positions itself, its voice.
2. **Who exactly buys?** The real ICP - not a demographic sketch, a person with a job to do.
3. **Which pains does the product solve for that buyer?** Grounded in what the product verifiably does.

Competitor lists, search keywords, and market pain-point mining do NOT happen here - they are research-stage work (meta-ads-research) that builds on this DNA. The brand DNA is the only thing that changes between brands; every other skill works unchanged.

## Inputs

- **company_url** (required): the site to research.
- **founder_notes** (optional): positioning/context from the founder, in their words.
- **slug** (required): brand folder name.
- **work_root**: the pipeline work root (`$UGC_WORK_ROOT`, set per project).

## Process

1. **Research the site deeply**: fetch the company URL and its key subpages (product, pricing, about). Extract what the product actually does, for whom, and every claim the site itself makes. Do not invent capabilities.
2. **Research the market position with Perplexity** (`$PERPLEXITY_API_KEY`, model `sonar`): who this company is in its category, how it's perceived, who its buyers actually are, and what those buyers say the product category is for. Open and loose - follow what the research surfaces rather than filling quotas.
3. **Write the ICP as a person**: who they are, the job they're hiring the product for, the moments they act, their objections - and the **Target Audience Language Profile**: the emojis they use, their slang, the aesthetics they follow, and how they phrase their frustrations in their own words. Every downstream hook, overlay, and caption must stay inside this profile so content reads insider-made.
4. **Extract verified claims** into claims.md - the claims guardrail's source of truth.
5. **Write the voice**: tone-of-voice adjectives with a sentence each on what they mean in practice for this audience.

## Outputs -> `{work_root}/brands/{slug}/`

1. `profile.md` - who the company is: what the product does, positioning, voice (tone in practice).
2. `icp.md` - who buys and why: the persona, the job-to-be-done, the pains the product solves for them, objections, buying moments, and the **Target Audience Language Profile**.
3. `claims.md` - **the verified claims document**: every claim the brand may make in an ad, each with its source (site page / founder notes), plus the explicit not-claimable list. Downstream, meta-ads-scripts' claims check passes ONLY copy whose factual statements trace to this file.
4. `profile.yml` - machine-readable contract:

```yaml
name:            # display name
slug:            # folder slug
landing_url:     # the real destination URL for ads
one_liner:       # the product in one sentence
icp:
  who:           # one-sentence persona
  solves: []     # the pains the product solves for this buyer (grounded in claims.md)
  objections: []
tone: []         # voice adjectives
offer_cta:
  text:          # CTA copy
  cta_type:      # Meta CTA enum, e.g. LEARN_MORE
do_not_say: []   # claims guardrail: banned claim types (fabricated testimonials, invented stats, guaranteed outcomes, platform-policy violations)
```

If the brand has no usable destination URL, create and publish a simple landing page and record its URL (ads require a real link).

## Verify before done

- Every profile.yml field populated (no empty keys)
- Every claim in claims.md traces to a source; the not-claimable list is explicit
- The Language Profile contains actual observed language, not invented slang
- landing_url loads (200, cache-busted)
