workspace/.ralph/brands/ and workspace/.ralph/personas/, and the same generation pipelines read them.
Brand vs. persona
The distinction lands inside the first scene.- A brand is the sender. Logo, palette, tone of voice, target audience, hard “no”s. If the project is for “Old Spice,” the brand carries Old Spice’s name, brand-safe color cues, the irreverent-confident tone, and the audience profile (urban 18-35 male). The brand never appears as a face on-screen — it is the register the whole video sits in.
- A persona is the protagonist. A specific on-screen character with a face, a voice, a wardrobe, and an attitude. “Founder Megan, the warm-but-direct CEO who narrates the testimonial.” “Tralalero Tralala, the AI-generated shark with the gibberish Italian VO.” “The deadpan 2-hander pair from
@americanbaron.” Personas carry photo refs (master shots) that the agent passes via--refon every i2v generation to lock identity (seefeedback_super_original_refs.md-style memory entries).
The brand JSON
workspace/.ralph/brands/<id>.json:
toneandaudienceseed the scenarist’s voice. The scenarist playbook reads these before drafting beats.do_notis the highest-leverage field. Concrete refusals — “no stock-coffee-bean macro shots” — kill the most common AI drift modes in one line. Always populate this with the postmortem-learned anti-patterns from sibling projects.paletteis consumed at editor-stage for caption colors, lower-thirds, and any on-screen typography. The image generators receive palette hints as part of the prompt, but the editor is where it lands hard.
The persona JSON
workspace/.ralph/personas/<id>.json:
master_shotsis the photo-reference list. The agent passes one or more of these via--refon every i2v call. Without master shots, the model invents a new face every scene.wardrobe_lockis the prose lock. Restated inside every keyframe prompt to keep clothing consistent across scenes.anti_driftis the personal version of the brand’sdo_not. The Sony A7 IV / Portra 400 photoreal register cited innoski-people-001’s postmortem is held in part by these refusals (seefeedback_photoreal_still_register).voice.elevenlabs_voice_idlocks the VO. The voiceover stage reads this directly.
Generic role vs. named persona
Not every video needs a persona JSON. If the scenario calls for “a barista” or “the founder” without naming a specific person, the agent treats it as a generic archetype — the ref-required gate does not fire (seecli/lib/eval/refs.ts, the GENERIC_ARCHETYPE_TOKENS set: barista, founder, ceo, engineer, teacher, …). The first generation pass picks a face, the master shots get saved off, and the project locks identity from there.
If the scenario names a specific real human (“Elon Musk,” “Beyoncé”), that is a ref-required case (gate kind person) — see /concepts/references. A persona JSON does not satisfy that gate unless it has photo refs from the actual person.
When to use which
A simple table.| Situation | Brand? | Persona? |
|---|---|---|
| One-off “make a video about X” — no recurring identity | optional | no |
| Client work with a recurring product line | yes | sometimes (if a founder / customer recurs) |
| A creator account with one recurring on-camera face | yes (creator’s brand) | yes (the creator’s face) |
| Italian Brainrot meme project — Tralalero | no (no consistent brand voice across memes) | yes (Tralalero, with master shots from the asset catalog) |
| Brand testimonial with a different customer each time | yes | no (each customer is one-off, fresh face per project) |
| A two-hander recurring duo | yes (the channel’s brand) | yes — one persona per character |
Attaching to a project
tone and do_not, the art-director reads the persona’s master_shots and feeds them into every i2v call as --ref, and the editor reads the brand palette for caption styling.
You can attach one brand and multiple personas to a project. A “founder talks to customer” two-hander has the channel brand plus two personas. A pure object-drama project (anthropomorphic fruit) has a brand but no personas.
CRUD verbs
ralphy brand create writes workspace/.ralph/brands/<id>.json and ralphy brand update mutates it. Editing the JSON by hand is allowed; the CLI re-reads on every project attach.
Brand voice vs. persona voice
Two registers, often conflated.- Brand voice is how the narration sounds when the brand speaks — the tone of the voiceover, the on-screen text, the captions. It lives in the brand’s
tonefield. A confident-irreverent brand voice produces “We make coffee that doesn’t suck” captions; a warm-direct brand voice produces “Most mornings, you just need a good cup.” - Persona voice is how a specific character sounds when they speak on camera. It lives in the persona’s
voice.elevenlabs_voice_idandvoice.style. The same brand can have a confident-irreverent brand voice and a warm-but-direct persona voice — the founder narrates softly inside an irreverent surrounding cut.
Related
- Projects — how brands and personas attach to a project
- References — when a persona JSON does not satisfy the ref-required gate
- Asset catalog — for personas built from companion-repo characters (Italian Brainrot etc.)
- Scenarist playbook — reads brand
toneanddo_notbefore drafting beats - Art-director playbook — passes persona
master_shotsvia--ref