← Files HiggsfieldARCHIVED FILE

skills/ugc-review-video/references/ugc-character.md

62.7 KB · Oct 5, 2026 · 12:03 UTC

↓ Download file

# UGC creator/persona prompt — full rule set

This file is the complete rule set for the creator/persona image prompt — the person who appears
in every downstream clip. There is no enhancer service here: you read these rules, write ONE
prompt string yourself, and submit it.

```json
generate_image_batch({"requests":[{"index":0,"params":{
  "model":"soul_2",
  "prompt":"<the string you wrote>",
  "count":1,
  "aspect_ratio":"3:4",
  "quality":"2k"
}}]})
```

Wait on the returned indexed job with `jobs_wait({jobs:[{index,job_id}],timeout_seconds:15})`
until terminal, then keep `(character_media_id, character_url)` = `(job_id, result_url)`. That
identity is reused by every board and every clip and is never
regenerated mid-run. Record the traits you wrote (age band, hair, build, wardrobe anchors) in
your own notes — you cannot re-inspect the generated image later, so the written description IS
the continuity contract.

You are a UGC creator/persona prompt enhancer. You work from structured inputs describing a product context and any user-specified overrides, and you output ONE production-ready prompt string for the Soul 2.0 text-to-image model (`soul_2`) that generates the creator/persona who will appear in the downstream UGC video.

Write the prompt as a plain string; there is no JSON wrapper and no enhancer service in
this pipeline.

---

## Inputs to settle before writing

Settle these yourself from the brief, the product analysis, and the run state — nothing is
handed to you:

```
{
  "tier": "luxury" | "premium" | "drugstore",
  "category": "<string — e.g. skincare, cosmetics, fragrance, food, fitness, cars, tech, ...>",
  "gender": "woman" | "man",
  "user_request": "<original brief verbatim — backup parsing + tone signals>",
  "user_overrides": {
    "location":          "<optional string>",
    "hair_color":        "<optional>",
    "hair_style":        "<optional>",
    "ethnicity":         "<optional>",
    "outfit_register":   "<optional>",
    "age_band":          "<optional>",
    "build":             "<optional>",
    "distinctive_feature": "<optional>",
    "makeup":            "<optional>",
    "mood":              "<optional>",
    "outfit":            "<optional — full outfit override>",
    "time_of_day":       "<optional>",
    "...":               "..."
  },
  "previous_character_traits": null | {
    "age_band": "...", "hair_color": "...", "hair_style": "...",
    "build": "...", "distinctive_feature": "...", "makeup": "...",
    "ethnicity": "...", "outfit_register": "..."
  },
  "variety_rolls": [r1, r2, r3, r4, r5, r6, r7, r8]
}
```

- `tier`, `category`, `gender` are always provided.
- `user_overrides` lists every field the user explicitly specified. Empty object `{}` when no specifics.
- `previous_character_traits` is the previous character generated in the same session. `null` for first-of-session.
- `variety_rolls` is EIGHT integers you pick yourself, each in `[0, 99]`, freshly varied per
  character. They map deterministically to the Variety Defaults pools below. Never reuse the
  same eight numbers for two characters in one session — that is what keeps creators distinct.


## Output

The prompt string itself — plain text, no JSON wrapper, no fences, no commentary. Pass it as
`requests[0].params.prompt` of the `generate_image_batch` call at the top of this file
(`soul_2`, `3:4`, `2k`).

## CRITICAL — No Products in the Character Image

The generated image is a CLEAN PERSON. The product is composited LATER in the downstream video pipeline.

- Prompt describes ONLY the person: appearance, face, expression, clothing, pose, style.
- NEVER include products, objects, props, items, or anything the person holds or interacts with.
- Location/background is OK (bedroom, bathroom, kitchen, outdoor) — but NO objects in hands.

**Bad:** "a young woman holding a skincare bottle in a bathroom, smiling" — model bakes the bottle into the image, downstream compositing fails.
**Good:** "a young woman, mid-20s, natural beauty, friendly smile, casual style, modern bathroom background" — clean person, product added at video step.

This rule is non-negotiable.

---

## Beauty Floor (mandatory in every prompt)

The persona must always read as conventionally attractive — model-tier face, symmetrical features, well-proportioned figure. This holds across every tier (drugstore through luxury). Tier changes the wardrobe, the room, and the aesthetic register — it does NOT lower the beauty bar.

Every prompt MUST contain these four anchor phrases (or close paraphrases woven in naturally):

- `with high model facial features`
- `symmetrical features`
- `well-proportioned figure`
- `natural skin texture`

These four anchors lock the editorial-grade face structure, prevent plastic/AI look, and ensure the person looks like a real attractive creator regardless of tier.

---

## User Override Rule (priority over everything below)

If `user_overrides` specifies any concrete detail — setting, location, clothing, appearance, mood, time of day, props, hair color, ethnicity — that detail wins over every default in this prompt. Defaults exist ONLY to fill gaps the user left empty. Never replace a user-specified detail with a default.

For each axis where `user_overrides` provides a value: SKIP the corresponding variety roll. Use the user's value verbatim.

### Backup parsing from `user_request`

`user_overrides` is the structured form the upstream agent already extracted. `user_request` is the raw brief, used as a SECONDARY signal source:

1. **Tone signals.** Scan `user_request` for tone keywords — `goth`, `vampire`, `cinematic noir`, `cold`, `passive`, `deadpan`, `clinical`, `refined`, `luxury-passive`, `minimal`, `somber`, `serious`, `dark`, `shadowy`, `Y2K`, `streetwear`, `preppy`, `coastal`, `boho`, `editorial`, `leather-grit`, `quiet-luxury`. Apply matching defaults (e.g. tone = `goth` → darker palette, calm mid-action expressions, Pattern D mood; vibe = `Y2K-coded` → mini skirt + chunky choker register).
2. **Missed overrides.** If `user_request` explicitly mentions a concrete trait that is NOT in `user_overrides` (e.g. user_request: "make her with messy red hair" but `user_overrides.hair_color` is missing), treat that trait as if it were in `user_overrides` — SKIP the corresponding variety roll and use the user's value verbatim.
3. **`user_overrides` always wins over `user_request`** for the same axis. If `user_overrides.hair_color = "ash blonde"` and `user_request` says "red hair", use "ash blonde" — `user_overrides` is the agent's resolved decision.
4. **Persona / accent / quirk passthrough — VISUAL side only.** If `user_request` or `user_overrides` carries an approved persona, accent, or character quirk (e.g. "deadpan Parisian it-girl", "raspy gym girl", "always fidgeting with her rings"), bake ONLY what a still image can show: the attitude must be readable in the FACE — pick the Approved mid-action expression that matches it (deadpan → `natural unguarded face, soft neutral expression, not smiling at the camera`; playful → `mid-react squint — one eye scrunching, half-grin pulling sideways`) — and a PHYSICAL quirk's worn prop must be visibly present (the thin stacked rings, the reading glasses, chipped nail polish). Worn only, never in hands — the no-products rule stands. Voice, accent sound, and speech style NEVER enter the image prompt — they belong to the downstream video step. Accent/nationality signals render by FEATURES and styling, never by naming the ethnicity word (same law as the Variety pools; verbatim `user_overrides.ethnicity` is the only exception).

---

## Product-Logic Casting — category gate (runs BEFORE the Variety rolls)

The character's look must leave ROOM for the product to work — if the "before" already looks like the "after", the pitch is dead. Apply these category locks BEFORE resolving the makeup / hair rolls below. The gate outranks the rolls, but NOT `user_overrides` — a user-specified makeup, hair, or appearance value still wins verbatim.

| Product category | Appearance lock |
|---|---|
| Skincare / cosmetics / beauty devices | Makeup register FORCED to `bare-skin no-makeup` regardless of `variety_rolls[5]`. If the product IS makeup, the face still starts bare — application happens downstream in the video, never in this image. |
| Haircare | Hair worn DOWN with natural texture — constrain the hair style roll to the down subset: `[shoulder-length wavy, long sleek straight, long with soft waves, medium with curtain bangs, sleek bob (chin-length), wolf cut, half-up half-down]`, picked as `down_pool[variety_rolls[2] % 7]`. No slicked-back, no buns, no braids, no ponytails, no updos — the product transforms the hair, so the hair must be visible and untransformed. |
| Teeth / smile products | Natural real teeth visible — pick a smiling / mid-laugh Approved mid-action expression; never a veneer-perfect smile. |
| Sleep / energy products | The state shows: slight under-eye shadows — an honest "before", tired-but-attractive, never haggard. |
| Fitness / supplements | Believable body from the rolled build; a slight post-workout flush is allowed and beats gym-model polish. |
| Fashion / accessories / jewelry | OPPOSITE — full styling allowed and expected. No lock. |

**General law:** identify what the product changes, then UNDO that change in the character's default look.

**Beauty Floor reconciliation:** the four Beauty Floor anchors stay in every prompt — bare face is NOT bad skin. `bare-skin no-makeup` renders as visible pores and natural unevenness on a model-tier face; under-eye shadows stay subtle and honest, never illness.

---

## Variety Defaults — sampling from `variety_rolls`

When `user_overrides` does NOT specify a trait, you MUST pick one option from the corresponding pool using the provided roll: `pool[roll % len(pool)]`. This defeats LLM-bias toward "familiar" pool options.

| Roll index | Axis | Pool size | Pick rule |
|---|---|---|---|
| `variety_rolls[0]` | Age band | 4 | `pool[r0 % 4]` |
| `variety_rolls[1]` | Hair color | 14 | `pool[r1 % 14]` |
| `variety_rolls[2]` | Hair length & style | 14 | `pool[r2 % 14]` |
| `variety_rolls[3]` | Build / vibe | 5 | `pool[r3 % 5]` |
| `variety_rolls[4]` | Distinctive feature | 6 | `pool[r4 % 6]` |
| `variety_rolls[5]` | Makeup register | 9 | `pool[r5 % 9]` |
| `variety_rolls[6]` | Ethnicity / face read | 8 | `pool[r6 % 8]` |
| `variety_rolls[7]` | Outfit aesthetic register | 10 | `pool[r7 % 10]` |

### Pools (indexed from 0)

**Age band (pool size 4):**
0. early 20s
1. mid 20s
2. late 20s
3. early 30s

**Hair color (pool size 14):**
0. warm honey blonde
1. cool ash blonde
2. chestnut
3. espresso
4. soft brown
5. jet black
6. deep auburn
7. copper
8. platinum
9. honey balayage
10. money-piece highlights
11. vivid green
12. vivid pink
13. pastel lavender

**Hair length & style (pool size 14):**
0. shoulder-length wavy
1. long sleek straight
2. long with soft waves
3. medium with curtain bangs
4. sleek bob (chin-length)
5. pixie cut
6. wolf cut
7. claw-clip slicked back
8. messy low bun
9. half-up half-down
10. boxer braids
11. high ponytail
12. dreadlocks (locs)
13. shaved buzz cut

**Build / vibe (pool size 5):**
0. athletic toned
1. soft natural
2. average proportional
3. petite
4. tall everyday

**Distinctive feature (pool size 6):**
0. clean (no distinctive feature)
1. natural freckles across cheekbones
2. delicate nose stud
3. dimples
4. gap teeth
5. subtle beauty mole on cheek

**Makeup register (pool size 9):**
0. bare-skin no-makeup
1. casual natural
2. glowy with mascara only
3. soft brown smoky eye
4. playful winged liner
5. bold colored eyeliner accent
6. brushed-up feathered brows, bare lids
7. graphic blush draped across cheekbones
8. glossy lip with neutral face

**Glitter hard ban (all makeup registers):** never write glitter, shimmer, sparkle, or "inner-corner highlight" anywhere in the prompt — not even as a tiny accent on an otherwise natural face. The recurring "natural base with a tiny inner-corner glitter highlight" line is a known render-slop signature (it landed on 5/5 characters in production). The rolled register is rendered exactly as named, with nothing sparkly added on top.

**Ethnicity / face read (pool size 8):**
0. fair European
1. warm Mediterranean
2. East Asian
3. South Asian
4. Latina
5. mixed
6. Middle Eastern
7. Slavic

(Render the face by FEATURES rather than naming the ethnicity word in the prompt itself.)

**Outfit aesthetic register (pool size 10):**
0. streetwear-oversized
1. preppy / equestrian
2. Y2K-coded
3. quiet-luxury
4. coastal-minimal
5. sporty-jersey
6. editorial-blazer-cool
7. boho-soft
8. leather-grit
9. clean-minimalist

### One bold visual anchor (composition law — NOT a new roll)

Every character gets exactly ONE loud visual element the frame is built around — and it is DERIVED from what the rolls (or user overrides) already gave you, never invented on top of them. Scan the picked traits in this priority order and take the FIRST hit as the anchor:

1. Vivid / unusual hair color (`vivid green`, `vivid pink`, `pastel lavender`, `platinum`, `copper`)
2. Statement hair style (`shaved buzz cut`, `boxer braids`, `wolf cut`, `dreadlocks (locs)`)
3. Loud distinctive feature (`gap teeth`)
4. If all of the above rolled quiet — ONE statement accessory from the rolled register's vocabulary (chunky chain choker, statement cap, layered pendants) becomes the anchor.

Give the anchor the RICHEST description in the prompt — not `pink hair` but `vivid bubblegum-pink hair with blunt bangs and a glassy sheen`. Everything else stays quiet in support: if the anchor is the hair, makeup and accessories stay understated; if the anchor is an accessory, the hair description stays simple. TWO anchors compete; three is noise. Never ADD a loud element the rolls didn't grant — the anchor amplifies a rolled pick, it never overrides or replaces one, and it never overrides a user-specified trait.

### Feminine legibility guard (conditional — women only; adds no roll, changes no pool)

Runs ONLY when `gender == "woman"`. Some combinations of otherwise-legal picks
strip every feminine signal out of the prompt at once — a cropped/masculine-coded
haircut, a bare face, and a figure-hiding oversized top can all land together, and
with only the word "woman" left to carry the read, the model renders a masculine
face. This guard restores the read WITHOUT touching any roll, pool, or the
Product-Logic gate.

Evaluate these three axes on the ALREADY-resolved picks (after rolls, gate, and
user overrides):

- **A — cropped / masculine-coded hair:** the resolved hair style is one of
  `pixie cut`, `wolf cut`, `boxer braids`, `dreadlocks (locs)`, `shaved buzz cut`.
- **B — bare face:** the resolved makeup register is `bare-skin no-makeup`
  (whether forced by the Product-Logic gate or rolled).
- **C — figure-hiding top:** the resolved outfit register is `streetwear-oversized`
  or `sporty-jersey`, OR the resolved recipe's top is an oversized/boxy tee, hoodie,
  or jersey with no waist definition.

**If TWO or more of A / B / C are true, apply BOTH corrections:**

1. **Lock the feminine face read.** Alongside the four Beauty Floor anchors in
   line 1, weave in this clause verbatim (or a close natural paraphrase):
   `soft feminine facial features, a delicate jawline, smooth cheekbones, naturally
   full lips, and defined natural lashes`. These are the person's OWN features, not
   applied makeup — they do NOT violate a bare-face skincare/cosmetics shot
   (nothing is "applied", no product on the face).
2. **The anchor may NOT be the hair.** Skip hair in the "One bold visual anchor"
   priority scan for this character — even if a statement hairstyle rolled. Fall
   through to the distinctive feature, else a register accessory. The cropped hair
   is still rendered exactly as rolled, just described PLAINLY and never amplified,
   so it stops dominating the frame.

If only ONE (or none) of A / B / C is true, this guard does nothing — the anchor
law and face description run unchanged.

This guard never fires for `gender == "man"`, never adds a roll, never changes a
pool size, and never overrides a `user_overrides` value (a user who explicitly
asked for a buzz cut + bare face still gets exactly that).

### Anti-clone rule

If `previous_character_traits` is provided, compare the rolled picks against it on these axes: `age_band`, `hair_color`, `hair_style`, `build`. The new character MUST differ in at least TWO of those four.

If the rolled combo matches the previous on ≥3 of those axes, deterministically shift conflicting axes forward: `new_index = (roll % pool_size + 1) % pool_size`. Repeat the shift up to 3 times if still conflicting. Never shift axes the user explicitly specified. When the Product-Logic gate constrains an axis to a subset, the shift runs INSIDE that constrained subset — for haircare's hair style that is `down_pool[(r2 % 7 + 1) % 7]` — never back out into the full pool: a shift must never land on an option the gate bans.

**Recipe anti-clone (Wardrobe Bank):** consecutive characters should avoid repeating the same bank recipe or hair anchor — a hard guarantee ONLY where the register's subset holds ≥2 recipes. On a size-1 subset (every men's row) an in-subset shift is a no-op; there the escape hatch is the one-time register shift from "Outfit aesthetic register × Tier" (still at most once), and if that shift is already spent the repeat is accepted. Hair repeats are already caught by the hair axes above. `previous_character_traits` carries no recipe id, so detect the LIKELY recipe repeat from what it does carry: if the new register equals the previous `outfit_register` AND the rolled hair matches the previous on BOTH `hair_color` and `hair_style` (after any shifts), shift the recipe pick by one inside the register's subset: `(variety_rolls[1] + variety_rolls[2] + 1) % subset_size`. This detection is best-effort — different hair can still land the same recipe, and that is accepted. Skip this entirely when `user_overrides.outfit` is in play — the bank is bypassed there.

### Outfit aesthetic register × Tier (mandatory layering)

The `Outfit aesthetic register` roll selects the wardrobe VOCABULARY / style genre. The Location × Tier × Wardrobe Matrix below selects the FORMALITY level. Both apply together — the register tells you WHAT KIND of look, the tier tells you HOW REFINED the materials are.

Vocabulary anchors per register:

- `streetwear-oversized` — oversized graphic tee or hoodie + baggy / wide-leg trousers or denim + chunky sneakers + layered chain necklaces
- `preppy / equestrian` — blazer + silk neck-tie or cream silk blouse + leather accents (gloves / belt) + structured bag
- `Y2K-coded` — mini skirt or slip dress + butterfly hair clips + chunky choker + small bag
- `quiet-luxury` — cashmere or merino knit + tailored trousers + delicate gold jewelry + minimal leather accessories
- `coastal-minimal` — linen shirt + cream wide-leg trousers + simple gold hoops + woven / leather sandals
- `sporty-jersey` — oversized sports jersey or polo + baggy trousers or shorts + bandana or hair clip + sneakers
- `editorial-blazer-cool` — pinstripe or tailored blazer over tank / camisole + chunky chain choker + statement sunglasses
- `boho-soft` — slip dress or silk camisole + open cardigan + layered pendants + soft sandals
- `leather-grit` — leather jacket layer over knit or tee + dark denim or trousers + statement cap + boots
- `clean-minimalist` — fitted white shirt or knit + denim or trousers + delicate jewelry (this is the most stock register; pick others more often when the roll lands there)

These vocabulary anchors are the register's GENRE summary. When the wardrobe path lands on a dressed outfit, the register realizes as one of its Wardrobe Bank recipes (see "Wardrobe Bank" below) — the anchors then serve the robe / lounge / athletic matrix contexts and the invent-freely fallback.

The TIER calibrates materials and brand register: `luxury` reads as silk / cashmere / designer / fine gold; `premium` reads as quality cotton / branded / considered finishing; `drugstore` reads as everyday cotton / thrift-tier / plastic clips / basic chains. The REGISTER calibrates the SHAPE and aesthetic genre. Both apply together — a `Y2K-coded` luxury character wears a silk slip with a chunky gold chain; a `Y2K-coded` drugstore character wears a cotton tank with plastic butterfly clips.

If the rolled register feels physically wrong for the product (e.g. `sporty-jersey` for a high-end fragrance bottle), you MAY shift the register roll forward by one: `new_index = (r7 % 10 + 1) % 10`. Do this at most once. Most register × tier combinations work because the tier calibrates the register's vocabulary.

### Accessories as a system

Describe accessories from the register vocabulary as ONE coherent system, not a shopping list — name how the pieces relate: `layered silver chains — a chunky choker over a slim pendant`, `simple gold hoops with tiny matching studs`, `a few thin stacked rings`. Two to three related pieces maximum, all in ONE metal / material family per character (silver-toned OR gold-toned, never both). The tier still calibrates the material (luxury → fine gold / real silver; drugstore → basic chains / plastic clips), and when the character already has a bold visual anchor the accessory system stays quiet and supporting. Accessories are WORN only — nothing held, per the no-products rule.

### Casting for the offer — the one-degree bend (optional, subordinate)

When the picked character lines up too perfectly with the product stereotype (skincare → polished glowy natural; fitness → athletic sporty-jersey; tech → clean-minimalist), you MAY bend the cast by ONE degree using a detail the rolls already allow: the fitness character wears delicate reading glasses; the finance-app minimalist has the rolled `vivid pink` hair in a claw clip; the snack-food character keeps a deadpan `natural unguarded face, soft neutral expression` instead of the expected grin. The bend is what makes the character feel cast, not generated — but it is strictly subordinate: ONE small against-type detail, never two; it never overrides the tier's material register, never touches the modesty triplet, never replaces a rolled or user-specified trait, and never adds a second bold anchor. If the rolls already produced an against-type combo, that IS the bend — add nothing.

The modesty triplet from "Universal Outfit Modesty" below STILL applies on top of register × tier — necklines, lapels, sash-ties, garment-specific coverage stays mandatory regardless of register.

---

## Wardrobe Bank — the house outfit standard

When the wardrobe path lands on a DRESSED outfit — any matrix option reading casual chic / curated outfit / smart casual / stylish casual / casual everyday, as opposed to a robe, pajama / lounge set, or athletic set — dress the character FROM this bank instead of inventing garments. The recipes are the production-tuned house standard: combinations that render clean on Soul 2.0. Robes, lounge sets, and athletic sets stay exactly as the matrix prescribes (the Style DNA laws still flavor them: one metal family, one deliberate imperfection). The outfit is fashionable; the photograph is still a phone selfie — the bank never overrides the UGC camera rules.

**Precedence:** `user_overrides.outfit` bypasses the bank entirely — the user's outfit verbatim, plus modesty. The TIER still calibrates materials exactly as in "Outfit aesthetic register × Tier" (luxury reads silk / fine leather / real silver; drugstore reads cotton / rubber / basic chains). The Universal Outfit Modesty triplet and per-garment table still apply ON TOP of every recipe.

### Style DNA laws (govern every bank outfit AND every invented fallback)

1. **Silhouette contrast is the engine:** fitted top + voluminous bottom OR oversized top + slim/short bottom. Never fitted + fitted, never baggy + baggy.
2. **Monochrome base + ONE metal:** black / white / cream dominates; silver is the default metal (chunky rings, cuffs, chain belts); gold only for warm retro looks. Same one-metal law as "Accessories as a system". The ONE-metal half is absolute; the monochrome-base and metal-choice defaults govern INVENTED fallbacks — canonical recipes that name their own colours or metal (W4, W5, W15, W16, M1, …) are deliberate exceptions and the recipe text wins verbatim.
3. **White ribbed socks are a signature** — with flats, loafers, or platform boots.
4. **Eyewear as anchor:** Y2K shield, slim rectangular tinted, chrome sport frames, oversized nerd glasses — on the face or pushed into the hair. Statement eyewear counts as the ONE bold anchor when used.
5. **Headphones are jewelry:** chunky over-ear (black / white / silver) around the neck or on ears, or wired earbuds with visible cord. WORN only, never held — the no-products rule stands.
6. **Texture over print:** ribbed cotton, crinkled crepe, parachute nylon, mohair fuzz, patent leather, washed denim. **PRINT SIZE LAW:** when a garment carries a print or lettering, it is BIG — a bold graphic or wordmark filling the chest or back (`large varsity-style wordmark across the full chest`). Small chest logos and tiny lettering render as gibberish; large letterforms render clean. All lettering and crests FICTIONAL, always.
7. **One deliberate imperfection:** sleeves shoved to elbows, one strap slipping, shirt untucked on one side, cuffs unbuttoned, loose hair strands.

### Recipes — women (W1–W18)

Recipes list garments and accessories ONLY — hair always comes from the hair rolls (or the user); a recipe never sets hair. Condense the chosen recipe into the prompt under the existing laws: one bold anchor (if the rolls already granted a loud anchor, the recipe's statement eyewear / headphones go quiet or drop), accessories as ONE system of 2–3 related pieces in one metal, modesty on top.

- **W1 Balloon Noir** — black sleeveless mock-neck fitted top + black parachute-nylon balloon trousers cinched at the ankles + black platform-heel sandals + thin silver chain belt.
- **W2 Airy Gallery** — white crinkled-crepe boxy sleeveless top + black wide knee-length culotte shorts + white ribbed socks + black leather ballet flats + wide silver cuff.
- **W3 London Errand** — oversized navy-white breton stripe long-sleeve tee + black capri leggings with side slits + black ballet flats + oxblood leather shoulder bag.
- **W4 Seoul Soft-Office** — oversized powder-blue cotton shirt, sleeves rolled once + navy A-line midi skirt + grey retro running sneakers + caramel croc-texture shoulder bag.
- **W5 Sydney Minimal** — oversized white heavyweight tee tucked loosely front-only + black pleated wide bermuda shorts + white ribbed socks + black penny loafers + tiny gold hoops.
- **W6 Slick Capri** — black fitted sleeveless boat-neck top + black kick-flare capri trousers + black puffy platform slides + narrow black oval sunglasses + cream canvas tote.
- **W7 Dark-Street Otaku** — washed-black oversized graphic tee (big faded fictional print filling the chest) + black wide shorts + black crew socks + chunky lug-sole boots + chunky black over-ear headphones.
- **W8 Milan Prep Noir** — oversized double-breasted black blazer + white shirt + black pleated skirt + sheer black tights + white ribbed socks + black chunky loafers.
- **W9 90s Sitcom It-Girl** — white cap-sleeve baby tee under black fitted tank + black velvet mini skirt + knee-high black leather boots.
- **W10 Y2K Chrome Maximal** — washed denim corset top + super-wide dark carpenter jeans with embroidered fictional patches + sculptural chrome rings + mirrored wrap sunglasses.
- **W11 Newsprint Bodycon** — newsprint-pattern fitted mini dress (oversized fictional newsprint graphic).
- **W12 Y2K Dancer** — cropped boxy leather jacket over a black bralette + low-rise super-wide charcoal jeans with double studded belts + platform boots.
- **W13 Blur-Flash Grunge** — cream ribbed tank with a big faded fictional college arc across the chest + slim rimless tinted sunglasses + layered silver chains.
- **W14 Chrome Baby-Tee** — grey-navy raglan baby tee with a bold fictional varsity print filling the chest + chrome wraparound sport glasses low on the nose.
- **W15 Fuzzy Y2K Cafe** — pink-red striped fuzzy mohair crop sweater + washed denim mini skirt + wired earbuds around the neck + fuzzy pink wrist warmers.
- **W16 Mesh Rave Prep** — acid-green printed mesh long-sleeve over a black bralette + black-white plaid pleated wide culottes + gunmetal moto-hardware shoulder bag.
- **W17 Cyber Sport Tank** — black fitted cropped tank + grey camo baggy cargos + black studded star belt + chunky black headphones around the neck + silver star pendant.
- **W18 Studio Wolf-Cut** — black fitted halter tank + slim silver pendant + yellow-tinted rimless shield glasses.

### Recipes — men (M1–M4)

- **M1 Desert Cowboy Sport** — cream straw cowboy hat + white retro soccer jersey with green trim (big fictional crest) + black super-wide side-stripe trousers + black-stripe retro sneakers + narrow black sunglasses.
- **M2 Nerd-Prep Denim** — oversized washed-denim chore jacket + white shirt buttoned to the collar + navy-red striped tie + oversized black nerd glasses.
- **M3 Knit Maximalist** — oversized varsity-pattern knit cardigan in burgundy-cream (large fictional lettering) + light-wash balloon jeans cuffed high + black western boots + stacked silver rings.
- **M4 Paris Street** — navy fitted tank over a grey baby tee + light-grey parachute pants + silver wraparound sport sunglasses + silver chain + chunky headphones around the neck + cross-body strap bag.

**Modesty adaptation (mandatory):** recipes built on a bralette, crop top, halter, corset, or standalone tank take the layered adaptation for video characters — a cropped jacket, overshirt, or blazer worn over, closed enough to satisfy the per-garment modesty table (W12's leather jacket zipped to the chest; W16's mesh layer gets an opaque black top beneath and a jacket over; W10/W13/W17/W18 tanks and corsets layer under an overshirt or jacket with the triplet applied). The Universal triplet appears in the final prompt regardless.

### Register → recipe wiring (deterministic — the r7 roll stays canonical)

The outfit-register roll (`variety_rolls[7]`) keeps selecting the register exactly as before. Each register maps to a fixed recipe subset; `gender` routes women to W-recipes, men to M-recipes:

| Register (r7 pick) | Women subset | Men subset |
|---|---|---|
| streetwear-oversized | W7, W17 | M4 |
| preppy / equestrian | W3, W8 | M2 |
| Y2K-coded | W9, W10, W12, W15, W16 | M3 |
| quiet-luxury | W1, W4 | M2 |
| coastal-minimal | W3, W5 | M1 |
| sporty-jersey | W14, W18 | M1 |
| editorial-blazer-cool | W6, W8, W11 | M2 |
| boho-soft | W11, W15 | M3 |
| leather-grit | W12, W13 | M3 |
| clean-minimalist | W2, W5 | M2 |

Pick INSIDE the subset deterministically — never writer's choice, never a new roll:

```
recipe = subset[(variety_rolls[1] + variety_rolls[2]) % len(subset)]
```

with the subset ordered exactly as listed above. (The hair rolls double as the recipe selector; the numbers stay valid for this even when a user override skipped them for hair.) If the one-time register shift from "Outfit aesthetic register × Tier" fired, map from the SHIFTED register.

**Offer affinity (advisory, informs the one-time register shift only):** W1/W6/W8 sit naturally with fashion + luxury; W2/W4/W5 with lifestyle / home / apps; W7/W12/W17 with gaming / energy / streetwear; W15/W16 with beauty / playful Gen-Z; W9 with nostalgia plays; M2 with SaaS / office; M1/M3/M4 with sneakers / audio / drinks. This map never overrides the roll — it only steers the direction of the already-allowed single shift when the rolled register feels physically wrong for the product.

**Palette side:** the recipe's colours are fixed, so satisfy the wardrobe-palette agreement from the ROOM side — describe the space so its stated palette shares at least one tone with the recipe.

**Invent-freely fallback:** legal ONLY when the brief demands something no recipe covers (true flowing boho, seasonal outerwear, costume-adjacent asks). Then invent under the Style DNA laws + the register's vocabulary anchors + modesty. Never fall back out of convenience.

### Hair & face anchor bank (phrasing, never a hair source)

Hair ALWAYS comes from the hair rolls or the user — a recipe never sets hair. When writing the rolled style, prefer the house phrasings: bangs named precisely (curtain bangs, full blunt bangs, wispy micro-bangs, face-framing pieces), the bob family reads as French bob / chin-length bob / shag bob, buns read slick OR messy-curly, blowouts read layered, plus loose strands as the deliberate imperfection. Face extras enter only when the rolls or the register's accessory system already grant them: freckles, glasses pushed into the hair, one bold single-colour eyeshadow (only when the makeup roll landed on a coloured register — the glitter ban stands).

---

## Style

- Always natural, lifestyle, UGC-feel — NOT editorial, studio, or fashion.
- Approachable, authentic — NOT cold, stylized, or heavily art-directed.
- **Default light tone: neutral cool daylight ONLY. NEVER golden hour, NEVER warm sunset, NEVER orange/amber cast, NEVER late-afternoon warm wash. Even outdoor scenes use neutral midday or overcast diffusion.**

---

## Location × Tier × Wardrobe Matrix

**Priority order:**

1. `user_overrides.location` provided → use exactly that.
2. No location override → match `(category, tier)` below.
3. No product context at all → cozy home, bedroom or living room, casual everyday outfit.

| Category | Tier | Default location | Wardrobe |
|---|---|---|---|
| Cosmetics / makeup / fragrance | luxury | Stylish modern bedroom or vanity nook with designer furniture, soft architectural detail (paneled walls, statement mirror, refined textures) | Silk or satin robe in dark / brand-adjacent / neutral premium tones, tightly tied at the waist with closed modest neckline and lapels overlapping fully, OR designer pajama set, OR "already dressed for going out — applying the final touch" with curated outfit |
| Cosmetics / makeup / fragrance | premium | Bright clean modern bathroom or bedroom, considered details | Premium cotton robe tightly tied at the waist with closed modest neckline, casual chic top, or lounge-luxe set in neutrals |
| Cosmetics / makeup / fragrance | drugstore | Everyday bright bathroom or bedroom, lived-in feel | Cozy oversized cotton robe tightly tied at the waist with closed neckline / soft hoodie / casual fitted top |
| Skincare / haircare / body care / shower gel | luxury | Spa-like bathroom — marble, brass fixtures, rainfall shower, plants, refined materials | Silk robe or premium-feel bathrobe in muted tones, tightly tied at the waist with closed modest neckline and lapels overlapping fully |
| Skincare / haircare / body care / shower gel | premium | Bright modern bathroom — clean tile, matte fixtures, vanity lighting | Cream / oatmeal cotton robe tightly tied at the waist with closed modest neckline, casual lounge wear |
| Skincare / haircare / body care / shower gel | drugstore | Standard bright bathroom, friendly and lived-in | Cozy oversized robe tightly tied at the waist with closed neckline, casual t-shirt |
| Food / beverages / kitchen products | any | Modern kitchen — appropriate finish to tier (luxury: marble + brass; premium: white cabinetry + stainless; mass-market: bright friendly kitchen) | Casual chic — fitted blouse + jeans, knit top, or athleisure if health-coded |
| Protein / supplements / sports nutrition | any | Either home gym (clean dumbbells, mat, mirror, plants) OR bright kitchen (post-workout context) — pick the one that fits the product more (powder/shaker → kitchen; bars/recovery → kitchen or living room; gear-adjacent → gym) | Athleisure / athletic fitted top, joggers or leggings, fresh-from-workout vibe |
| Clothing / accessories / jewelry / watches | luxury | Stylish bedroom or dressing room — wardrobe rack, statement mirror, refined finishes | Curated outfit — "she's already styled, this is the finishing piece" — silk camisole + tailored trousers, or refined knit + slip skirt |
| Clothing / accessories / jewelry / watches | premium | Bedroom / living room with elevated styling — designer chair, plants, considered art | Casual chic — relaxed fitted top, high-waisted trousers, layered minimal jewelry |
| Clothing / accessories / jewelry / watches | drugstore | Bedroom / living room with everyday cozy feel | Casual relaxed outfit, comfortable layers |
| Fitness / sports / training equipment (dumbbells, kettlebells, weights, resistance bands, yoga mats, foam rollers, jump ropes, training apparel) | any | Home gym, living room mat area, or yoga corner with mat + plants + natural light | Athletic wear matching the discipline (compression top + leggings, sports bra + shorts, running fit, yoga set) |
| Cars / vehicles | any | Outdoor next to the car — driveway, sunlit street, parking pad, or garage with the door open. Walk-around angle, natural daylight | Stylish casual outerwear — light jacket, well-fitted denim or trousers, sneakers or boots; tier elevates the wardrobe (luxury: tailored coat, designer shades; everyday: clean casual) |
| Outdoor gear / sunglasses / summer wear / sunscreen | any | Outdoor café terrace, park, or sunlit street with people in soft background | Outfit appropriate to season + tier — linen shirt, sundress, lightweight set |
| Tech / electronics / audio | any | Home desk, living room, or studio nook (tier elevates the desk: luxury → wood + leather + minimal premium accessories; mass-market → bright clean desk) | Smart casual — fitted knit, button-down, or relaxed athleisure |
| Home / decor / candles | any | Living room or bedroom with the relevant ambiance — tier elevates materials (luxury: linen sofa, art, sculptural pieces; everyday: cozy throws, plants) | Lounge-elevated — soft knit, relaxed trousers, or cozy set |
| **Everything else** | any | Cozy home — bedroom or living room | Casual everyday outfit |

**Outdoor / street** is used only when the product clearly belongs in that context (cars, summer wear, outdoor lifestyle, café products). Otherwise indoor by default.

---

## Universal Outfit Modesty (mandatory — applies to every matrix entry)

Every wardrobe entry MUST be wrapped with explicit modesty language in the final prompt — even when the matrix says only "fitted blouse" or "casual chic top". Soul 2.0 will otherwise default to plunging V-cuts and exposed cleavage, which then trips downstream NSFW filters (`gpt_image_2` board step, Seedance video step). This rule is non-negotiable and applies regardless of tier or category.

### Universal triplet (append to every outfit description)

```
top fully closed at the front, fabric meeting at the collarbone, classic high-coverage fit
```

### Per-garment specifics (layer on top of the universal triplet)

| Garment type | Required modesty language |
|---|---|
| Button-down / shirt | `fully buttoned to at least the second-from-top button` |
| Knit / sweater / fitted top | `modest crew or scoop neckline, no V-cut` |
| Blouse | `modest closed neckline, no plunging V, no deep décolletage` |
| Robe / kimono / silk wrap | `tightly tied at the waist with sash visible, both lapels overlapping fully across the chest` |
| T-shirt | `fitted but with a modest crew neckline` |
| Tank top / camisole / spaghetti strap | **FORBIDDEN as standalone.** Only allowed when explicitly layered under a button-down / cardigan / blazer that itself follows the modesty rules above |
| Athletic top / compression top | `high crew or modest scoop neckline, fully covering chest` |

### Bottom

Bottom-half wardrobe (jeans, trousers, leggings, skirts) is already implicitly covered by the matrix entries — no extra rule needed beyond `tucked into high-waisted ...` phrasing where applicable.

### Positive structural language

Across every outfit description, prefer positive phrasing — `fully buttoned to the collar`, `crew neckline at the collarbone`, `tightly tied at the waist with sash visible` — over negations like `no V-neck`, `zero neckline exposure`, `completely covering chest`. Diffusion text encoders prime on negation trigger words (`chest`, `torso`, `neckline`, `exposure`) and often render the very thing being negated.

### Example: applying universal modesty to a matrix entry

Matrix says: `casual chic top + jeans`

Final prompt outfit description:
> `a fitted long-sleeve blouse with a modest closed neckline, no plunging V, no deep décolletage, fully covering chest and torso, tucked into high-waisted dark denim jeans`

Matrix says: `fitted neutral knit + denim`

Final prompt outfit description:
> `a fitted neutral knit top with a modest crew neckline, no V-cut, fully covering chest and torso, paired with well-cut straight-leg denim`

The modesty triplet appears in EVERY character prompt regardless of how short the matrix entry is.

---

## Lighting

- Always specify direction and quality — not just "natural light" but "soft natural daylight streaming in from the left window" or "cool diffused daylight from the right."
- **Default: neutral cool daylight ONLY — bright, clean, no warmth.** Use phrasing like "cool neutral daylight", "soft diffused white light", "clean midday light", "overcast diffusion".
- **HARD BAN: golden hour, warm sunset, orange/amber/honey cast, late afternoon warm wash, sunlit warm tones, "magic hour" — even outdoors.** These tones make the persona look like a stock-photo ad, not a real creator. Sunset is allowed ONLY when `user_overrides` explicitly asks for it.
- For outdoor scenes (cars, café terrace, park), use neutral midday or overcast — describe explicitly: "soft overcast daylight", "cool neutral midday sun, no warm cast".
- NEVER harsh studio strobes. NEVER pure white seamless background (unless the user asks).
- Light should interact with the space — mention how it hits surfaces in the room.

---

## Location Detail — always be specific

A named location alone ("kitchen", "bedroom") produces a plain wall. Always add architectural detail, materials, and color palette of the space:

- **What's in the background** — type of furniture, cabinetry, shelving, plants, textures
- **Materials** — marble, wood, tile, fabric, stainless steel, brass, linen, etc.
- **Color palette of the space** — dominant colors that set the mood (whites + beiges, warm wood tones, soft pastels, charcoal + brass, etc.). Name the DOMINANT palette explicitly in one line — the Prompt Structure's `Color palette dominated by ...` slot: one dominant field, one secondary tone, at most ONE loud accent. If the character has a bold visual anchor, the anchor IS that accent — never introduce a second loud accent colour, and keep the field/secondary tones neutral (no amber/orange dominance).
- **Wardrobe-palette agreement (mandatory)** — the wardrobe colour MUST contain at least one tone from the room's stated palette. If the palette is "deep charcoals + warm off-whites + brass" — wardrobe is in charcoal / off-white / cream / brass-tinted tones. NEVER pair a wardrobe in conflicting colours (e.g. crisp white shirt + dark navy trousers in a charcoal/brass room) — this creates a palette conflict and visibly degrades the rendered atmosphere.
- **World-logic coherence chain (mandatory)** — every element justifies every other, cause before effect:
  - **Product → world:** the location must natively contain the product's world (a whisk lives in a kitchen with flour on the counter). The product itself is still NEVER in frame — its natural habitat is.
  - **World → wardrobe:** would a real person wear this THERE — no heels on a hiking trail, no silk blouse next to a power drill. This extends the wardrobe-palette agreement above: the outfit must fit the room's world, not just its colours.
  - **Action → competence markers:** when the scene implies a practice (gym corner, workshop, kitchen), the space shows practitioner details — worn equipment, used tools racked properly, safety gear present as worn context, never decorative.

  Coherence is invisible when present, fatal when absent.
- **Depth of field** — describe naturally as `"subject in clear focus with the background naturally falling out as in any phone photo"`. Do NOT use `"minimal depth of field, soft subtle separation"` — that's editorial DSLR language, NOT phone aesthetic.

---

## Camera & Atmosphere — iPhone UGC is the DEFINING feature

The output MUST read as a real creator's phone photo — NOT a portrait shoot, NOT a fashion editorial, NOT a studio session. This is the most important rule in this prompt. Skip it and the whole UGC pipeline fails downstream.

### Mandatory iPhone phrasing — include in every prompt

- `Self-portrait selfie shot on iPhone front-facing camera held by the subject at arm's length — head and shoulders fill the frame`
- `Selfie geometry: subject's own arm extended toward the lens, hand or wrist may faintly appear at the edge of frame holding the phone`
- `Slightly off-center, slightly imperfect framing — not posed, not studio-centered`
- `Spontaneous angle with a slight casual tilt, intuitive composition — not symmetric, not centered`
- `Captured mid-moment, NOT a formal pose for the camera`
- `Subject minimally aware of the lens — relaxed, natural, like she just turned the camera on`
- `Phone-sensor grain and realistic skin pores and texture preserved — no retouch, no smooth-skin filter, no professional gloss`
- `Subject in clear focus with the background falling out naturally as in any phone photo`
- `Authentic UGC creator phone selfie, taken by herself with her own front camera at arm's length, NOT editorial fashion photography, NOT studio portrait, NOT magazine retouch`

### HARD BAN — never appear in the prompt

These phrases produce editorial / studio look — the OPPOSITE of UGC:

- `centered composition at eye-level` — too studio-posed
- `straight-on` — too composed, formal-portrait language
- `mid-length portrait`, `editorial portrait`, `fashion portrait` — genre language that flips the whole render to editorial
- `minimal depth of field, soft subtle separation` — too professional-DSLR
- `editorial mood`, `editorial atmosphere`, `crisp editorial` — opposite of UGC
- `aspirational lifestyle atmosphere` — too glossy advertising
- `flattering and even illumination` — too studio
- `glowing skin`, `flawless skin`, `radiant complexion` — too retouched
- `poised`, `refined expression`, `dignified pose`, `elegant stance`, `graceful posture` — posed-photography language
- `warm smile at the camera`, `looking at the camera with a smile`, `direct eye contact with the camera and a confident smile` — aware-of-camera mimic; replace with mid-action expressions (see below)
- Any "pose" verb: `poses`, `is posing`, `striking a pose`, `stands gracefully`
- Anything implying static camera, studio strobe, ring light, beauty dish, professional camera body
- `fisheye lens`, `ultra-wide`, GoPro-warp perspective — never describe or imply fisheye / ultra-wide distortion; the front camera reads as standard lens language, mild phone front-camera wideness at most

### Approved mid-action expressions (use one of these — never `warm smile`)

Pick ONE expression descriptor per prompt that reads as a captured moment, not a posed shot:

- `mid-thought, slight half-smile, eyes glancing slightly off-lens`
- `caught mid-laugh, soft natural laugh, head slightly tilted`
- `casually glancing toward the lens with a relaxed, neutral expression`
- `looking up from her phone with a relaxed, unguarded face`
- `mid-action expression — in the middle of saying something, not posing`
- `natural unguarded face, soft neutral expression, not smiling at the camera`
- `wide-eyed mid-gasp, lips parted, brows lifted — caught at the start of a reaction`
- `mid-laugh with mouth open, head thrown slightly back, shoulders shifted`
- `playful mock-shock — round eyes, slight grin breaking under the surprise`
- `mid-react squint — one eye scrunching, half-grin pulling sideways`
- `eyebrows lifted mid-thought, lips pressed in a "wait, no" line, head tilted slightly`

### Body pose — neutral only

The mid-action energy above lives in the FACE. The BODY stays in a calm, normal pose: relaxed standing, weight slightly on one hip, one hand resting naturally, head level. Creative body poses are an anatomy gamble — extended limbs warp, foreshortened hands grow fingers. NEVER: a hand thrust at the lens, jumps, low-angle looming, limbs reaching toward camera, framing-the-face-with-hands, biting glasses as a pose. Interest lives in FACE + WARDROBE + the one bold anchor — never the pose.

### Closing block — append verbatim at the end of every prompt

```
Self-portrait selfie shot on iPhone front-facing camera held by the subject at arm's length — head and shoulders fill the frame, casual handheld framing, slight natural tilt, slightly off-center, slightly imperfect, not posed. Phone-sensor grain and realistic skin texture preserved, no retouch, no smooth-skin filter. No fisheye lens, no ultra-wide distortion. Authentic UGC creator phone selfie, NOT editorial portrait, NOT fashion magazine.
```

---

## Safety Rules (applied BEFORE composing the prompt)

The parent skill's creator-authorization gate has precedence. Never construct a
recognizable public figure, celebrity, minor, or non-consenting real person. A
text description must produce an original fictional adult; a supplied identity
reference is legal only after the parent gate establishes authorization.

**1. Age enforcement — minimum 21 years old.**
If `user_overrides` requests a child, minor, or teenager, or otherwise leaves
adult status unclear, stop and return to the parent skill's authorization gate.
Do not compose a character prompt and do not silently age-transform the request.

**2. Anatomy & clothing.**
If `user_overrides` contains detailed descriptions of bare skin, specific body parts, or intimate anatomy — do NOT discard the prompt. Instead, adapt it by naturally weaving in clothing that covers sensitive areas:

- Female subjects: clothing that covers chest and lower body (pelvic area)
- Male subjects: clothing that covers lower body (pelvic area)
- Added clothing MUST match the aesthetic, setting, and style of the original prompt seamlessly

**3. Wardrobe modesty — robes / kimonos / silk wraparound pieces.**
When the wardrobe includes a robe, kimono, silk piece, or any wraparound garment, describe it with explicit modesty constraints:

- **Tightly tied at the waist** with the sash visible — NEVER "loose", NEVER "untied"
- **Closed modest neckline** — no plunging V-cut, no exposed chest, no deep décolletage
- **Both lapels overlapping fully** across the chest

Use phrasing like `"robe tightly tied at the waist with closed modest neckline, both lapels overlapping fully"` rather than just `"silk robe"` or `"cozy robe"`. This applies whenever the matrix wardrobe entry mentions a robe, regardless of tier.

---

## Default wardrobe path — pick from matrix, ROTATE

Select the wardrobe from the matrix entry matching `(category, tier)`. Each matrix row lists multiple options separated by `OR` / `,` (silk robe / pajama set / curated outfit; knit + denim / blouse + jeans / athleisure; compression top + leggings / running fit / yoga set; hoodie / fitted t-shirt; tailored coat / linen shirt / sundress; etc.). **ROTATE through them — never default to button-down for everyone.** When the matrix offers ≥2 options, pick one using `variety_rolls[7] % options_count` for variety. Apply the [Universal triplet](#universal-outfit-modesty-mandatory--applies-to-every-matrix-entry) once. **DO NOT add a camisole base layer to default outfits** — it kills variety and makes every character look identical.

When the picked matrix option is a DRESSED outfit (casual chic / curated outfit / smart casual / stylish casual / casual everyday — not a robe, pajama / lounge set, or athletic set), realize it through the Wardrobe Bank: the rolled register's recipe subset, picked with `(variety_rolls[1] + variety_rolls[2]) % subset_size`. Robes, lounge sets, and athletic sets stay exactly as the matrix prescribes.

---

## Prompt Structure

Gender is determined by `inputs.gender`. Default in the template below is `woman` — if `gender == "man"` use man / he / his throughout. Never mix genders in a single prompt.

```
A [age band from Variety pool] [man/woman], [expression — pick one from the Approved mid-action expressions list], [hair color + length from Variety pool], [build vibe], with high model facial features, symmetrical features, well-proportioned figure, natural skin texture, standing in a [specific location with architectural details].
[Light direction and quality — MUST be cool/neutral daylight, NEVER golden hour, NEVER warm sunset, NEVER orange/amber cast] falls across her face — neutral, clean, no warm cast, no retouched glow. Skin texture is real, with visible pores and natural unevenness.
[He/She] wears [outfit matching category × tier from the matrix — pick a non-default option from the matrix's list; a dressed option realizes as the Wardrobe Bank recipe — layered with the Universal modesty triplet and any per-garment specifics]. Body in a calm neutral pose — relaxed standing, one hand resting naturally.
The background features [specific details: materials, colors, furniture].
Color palette dominated by [space colors — keep neutrals; avoid amber/orange dominance].
Casual handheld iPhone selfie taken by [her/him] at arm's length — head and shoulders fill the frame, slight natural tilt, slightly off-center, intuitive composition, captured mid-moment. Subject in clear focus with the background naturally falling out as in any phone photo.
Shot on iPhone front-facing camera. Phone-sensor grain and realistic skin texture preserved, no retouch, no smooth-skin filter. No fisheye lens, no ultra-wide distortion. Authentic UGC creator phone selfie, NOT editorial portrait, NOT fashion magazine.
```

Do NOT use the ethnicity word literally in the prompt. Render by features. (E.g., `East Asian` → describe via features without saying "East Asian woman" — Soul 2.0 reads the features.) Exception: `user_overrides.ethnicity` provided verbatim wins.

The bold visual anchor (see "One bold visual anchor" above) lives in line 1 — give it the richest clause in the hair / distinctive-feature slot and let every later slot (makeup, accessories, palette accent) stay quiet around it.

---

## Reference Examples — target this quality level

### Kitchen — food / beverage / kitchen product (premium) — casual chic realized as W4 Seoul Soft-Office (quiet-luxury register)

```
A spontaneous iPhone snap of a young woman in her early 20s, mid-thought with a slight half-smile, eyes glancing slightly off-lens, with high model facial features, symmetrical features, well-proportioned figure, natural skin texture, standing in a modern, bright kitchen. Soft natural window light streams in from the left across her face — clean, neutral, no warm cast, no retouched glow. Skin texture is real, with visible pores and natural unevenness. She wears a casual chic outfit — an oversized powder-blue cotton shirt with the sleeves rolled once, fully buttoned to at least the second-from-top button, top fully closed at the front, fabric meeting at the collarbone, classic high-coverage fit, tucked loosely into a navy A-line midi skirt, with grey retro running sneakers and a caramel croc-texture shoulder bag worn on one shoulder. Body in a calm neutral pose — relaxed standing, one hand resting naturally. The kitchen background is defined by pristine white cabinetry, stainless steel hardware, and subtle recessed lighting, providing a clean and contemporary interior aesthetic. Casual handheld iPhone selfie taken by her at arm's length — head and shoulders fill the frame, slight natural tilt, slightly off-center, intuitive composition, captured mid-moment. Subject in clear focus with the background naturally falling out as in any phone photo. The color palette is bright, dominated by whites, beiges, and subtle tan accents. Self-portrait selfie shot on iPhone front-facing camera held by her at arm's length. Phone-sensor grain and realistic skin texture preserved, no retouch, no smooth-skin filter. No fisheye lens, no ultra-wide distortion. Authentic UGC creator phone selfie, NOT editorial portrait, NOT fashion magazine.
```

### Bathroom — skincare / haircare / body care (premium)

```
A spontaneous iPhone snap of a young woman in her mid-20s, casually glancing toward the lens with a relaxed, neutral expression, with high model facial features, symmetrical features, well-proportioned figure, natural skin texture, standing in a bright modern bathroom. Soft diffused daylight from the left falls across her face — neutral cool, no warm cast, no retouched glow. Skin texture is real, with visible pores and natural unevenness. She wears a cozy oversized cream-colored robe tightly tied at the waist with a closed modest neckline and lapels overlapping fully, casual and relaxed. Body in a calm neutral pose — relaxed standing, one hand resting naturally. The bathroom background features clean white subway tiles, matte black fixtures, a large mirror with warm vanity lighting, and a small plant on the counter. The color palette is soft and airy, dominated by whites, warm creams, and subtle sage accents. Casual handheld iPhone selfie taken by her at arm's length — head and shoulders fill the frame, slight natural tilt, slightly off-center, intuitive composition, captured mid-moment. Subject in clear focus with the background naturally falling out as in any phone photo. Self-portrait selfie shot on iPhone front-facing camera held by her at arm's length. Phone-sensor grain and realistic skin texture preserved, no retouch, no smooth-skin filter. No fisheye lens, no ultra-wide distortion. Authentic UGC creator phone selfie, NOT editorial portrait, NOT fashion magazine.
```

### Stylish bedroom — luxury cosmetics / fragrance / makeup

```
A spontaneous iPhone snap of a young woman in her mid-20s with a natural unguarded face, soft neutral expression, not smiling at the camera, with high model facial features, symmetrical features, well-proportioned figure, natural skin texture, standing in a stylish modern bedroom with paneled walls and a designer mirror. Soft cool daylight diffuses in from a tall window on the left, falling gently across her face and the room — neutral cool, no warm cast, no retouched glow. Skin texture is real, with visible pores and natural unevenness. She wears a charcoal silk robe with a subtle satin sheen, tightly tied at the waist with a closed modest neckline and lapels overlapping fully, hinting that she is mid-routine before going out. Body in a calm neutral pose — relaxed standing, one hand resting naturally. The bedroom background features a sculptural wooden nightstand, a single trailing plant, refined off-white linens, and a slim brass floor lamp. The color palette is muted and elevated, dominated by deep charcoals, warm off-whites, and soft brass accents. Casual handheld iPhone selfie taken by her at arm's length — head and shoulders fill the frame, slight natural tilt, slightly off-center, intuitive composition, captured mid-moment. Subject in clear focus with the background naturally falling out as in any phone photo. Self-portrait selfie shot on iPhone front-facing camera held by her at arm's length. Phone-sensor grain and realistic skin texture preserved, no retouch, no smooth-skin filter. No fisheye lens, no ultra-wide distortion. Authentic UGC creator phone selfie, NOT editorial portrait, NOT fashion magazine.
```

### Outdoor next to the car — automotive — stylish casual realized as W5 Sydney Minimal (clean-minimalist register)

```
A spontaneous iPhone snap of a young woman in her mid-20s, looking up from her phone with a relaxed, unguarded face, with high model facial features, symmetrical features, well-proportioned figure, natural skin texture, standing on a sunlit driveway next to a parked car. Soft neutral daylight from the upper right falls evenly across her face and the surrounding pavement, with a faint shadow cast on the ground beside her — neutral, clean, no warm cast, no retouched glow. Skin texture is real, with visible pores and natural unevenness. She wears a stylish casual outfit — an oversized white heavyweight tee with a crew neckline sitting at the collarbone, top fully closed at the front, classic high-coverage fit, tucked loosely in at the front only, black pleated wide bermuda shorts, white ribbed socks with black penny loafers, tiny gold hoops, and a light jacket layered over the shoulders. Body in a calm neutral pose — relaxed standing, one hand resting naturally. The background features a quiet residential street, a hedge with soft green foliage, and the front quarter of the car visible behind her. The color palette is bright and natural, dominated by cool asphalt grays, soft off-whites, and muted greens. Casual handheld iPhone selfie taken by her at arm's length — head and shoulders fill the frame, slight natural tilt, slightly off-center, intuitive composition, captured mid-moment. Subject in clear focus with the background naturally falling out as in any phone photo. Self-portrait selfie shot on iPhone front-facing camera held by her at arm's length. Phone-sensor grain and realistic skin texture preserved, no retouch, no smooth-skin filter. No fisheye lens, no ultra-wide distortion. Authentic UGC creator phone selfie, NOT editorial portrait, NOT fashion magazine.
```

### Home gym — protein / supplement / fitness

```
A spontaneous iPhone snap of a young woman in her early 20s, mid-action — in the middle of saying something, not posing, with high model facial features, symmetrical features, well-proportioned figure, natural skin texture, standing in a bright home gym corner. Soft natural daylight streams in from a tall window on the right, falling cleanly across her face and the matte rubber flooring — neutral, clean, no warm cast, no retouched glow. Skin texture is real, with visible pores and natural unevenness. She wears a fitted athletic set — a sage compression top with a high crew neckline, fully covering chest, paired with high-waisted leggings — with a slight post-workout flush and a few loose strands of hair framing her face. Body in a calm neutral pose — relaxed standing, one hand resting naturally. The background features a stack of clean dumbbells on a wooden rack, a rolled yoga mat, a tall potted plant, and a wall-mounted mirror reflecting soft light. The color palette is fresh and grounded, dominated by warm whites, muted sage greens, and natural wood tones. Casual handheld iPhone selfie taken by her at arm's length — head and shoulders fill the frame, slight natural tilt, slightly off-center, intuitive composition, captured mid-moment. Subject in clear focus with the background naturally falling out as in any phone photo. Self-portrait selfie shot on iPhone front-facing camera held by her at arm's length. Phone-sensor grain and realistic skin texture preserved, no retouch, no smooth-skin filter. No fisheye lens, no ultra-wide distortion. Authentic UGC creator phone selfie, NOT editorial portrait, NOT fashion magazine.
```

---

## Final reminder

One prompt string, built per the structure above — no JSON, no fences, no analysis, no metadata.
If an input is missing, fall back to the defaults in this file and still produce a prompt; never
refuse and never explain instead of writing.

SHA-256: 6d707ad5ccee6eac353397550db66cd521f68ba5db7098ba575e478f01ecd83d