> ## Documentation Index
> Fetch the complete documentation index at: https://docs.highailabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cantina Production Spec

> The character-lock prompt, shot prompt grammar, voice direction, and continuity rules that keep Professor High identical across every generated video.

## The Problem This Solves

AI-generated video is cheap enough to post daily. It is also drift-prone: the same prompt on two different days returns a slightly different character, and an audience notices a mascot whose face changes between episodes long before they can articulate why the account feels untrustworthy.

Character consistency is not a polish item. For a mascot-led account it **is** the brand. This page is the contract that keeps Professor High the same pineapple in episode 100 as in episode 1.

<Note>
  This spec is written for **Cantina**, but the structure — locked character block, shot grammar, negative prompt, continuity checklist — is tool-portable. If we change generators, port the blocks rather than rewriting from scratch.
</Note>

## The Cantina Prompt Block

Every script in every pack ends with a **Cantina Prompt** — a fenced block you copy whole and paste straight into Cantina. No assembly, no cross-referencing other pages.

Professor High **already exists in Cantina** with his image, voice, personality, and tone attached. So the prompt block deliberately does **not** re-describe him. Re-describing a character that is already loaded is the single most common way to make him drift — the app blends your fresh description against the saved one and you get a slightly different pineapple.

What the prompt block carries instead:

| Section                  | Why it is there                                                                                                  |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| **Title line**           | Show, episode ID, runtime, aspect ratio. Keeps renders traceable to the log.                                     |
| **TONE**                 | The emotional register for this specific episode. The one thing that changes most between episodes.              |
| **ENVIRONMENT**          | The set. Same lab every time unless the episode says otherwise.                                                  |
| **SHOTS + DIALOGUE**     | Numbered beats with timecode, camera direction, spoken line, and on-screen text. This is the body of the prompt. |
| **ON-SCREEN TEXT STYLE** | Burn-in rules so captions match across episodes.                                                                 |
| **AUDIO**                | Music bed and any recurring stinger.                                                                             |
| **DO NOT**               | The hard constraints. Repeated every time on purpose — these are account-safety rules, not style preferences.    |

<Note>
  The `DO NOT` block is repeated in all 50 prompts rather than referenced once. Repetition costs nothing and a moderation strike costs the account.
</Note>

### The Template

```text theme={null}
Professor High — [SHOW NAME] — [SCRIPT ID]
Runtime: [N] seconds | 9:16 vertical
CHARACTERS
- professor-high-v1 — LOCKED. Already loaded with his image, voice and
  personality. Do NOT re-describe him — re-describing a saved character is the
  main cause of drift.
- No supporting cast — Professor High alone.
- Any supporting role may be recast freely between packs, never inside one — a
  recast mid-pack turns a format test into a casting test. Briefs and swap
  rules: /social/cast
TONE: [register for this episode]. Sincere throughout. He never winks at the
camera or acknowledges that the premise is funny.

ENVIRONMENT: Working research lab. Dark pine-green or charcoal backdrop,
out-of-focus shelving, glassware and papers behind him. [Episode variation.]

SHOTS + DIALOGUE:
1. (0:00-0:0X) [camera + character state + frame element]
   SAYS: "[spoken line]"
   ON SCREEN: [burned-in text]
2. ...

ON-SCREEN TEXT STYLE: Bold sans-serif, white with heavy stroke, max 6 words
per line, lower third. Key terms in pineapple yellow #D98E04. Word-synced.
Keep 250px clear at the bottom and 120px at the top.

AUDIO: [music bed]. Voice normalized loudest. [Stinger if the show has one.]

DO NOT: No smoking, no lit product, no cannabis paraphernalia in frame. No
medical claims. No real dispensary, producer, or lab names. No logos.
```

<Warning>
  Fill every `[DATA: ...]` token in the script before pasting. A prompt with an unfilled token generates a video with a placeholder spoken aloud.
</Warning>

## Rule Zero: The Character Is Generated Once

Professor High is built **once** as a persistent character and reused. He is not re-described per video — re-describing a saved character makes the generator blend your new wording against the stored one, and that is what makes his face drift between episodes.

<Card title="Character Config — the canonical spec" icon="id-badge" href="/social/character-config">
  The full character-lock block, negative prompt, expression set, voice spec, and hard constraints live on one page. Paste the setup block **once** to create or repair `professor-high-v1`, then never again.
</Card>

<Steps>
  <Step title="Build the character once">
    Paste the [Cantina setup block](/social/character-config#the-cantina-character-setup-block) into Cantina. Save it as `professor-high-v1`.
  </Step>

  <Step title="Archive a reference set">
    Generate stills of all five expressions — neutral, excited, skeptical, disappointed, deadpan — at identical framing. These are the continuity ground truth for every future check.
  </Step>

  <Step title="Reuse the saved character for every shot">
    The per-script prompt blocks below assume he is already loaded. They carry the script, tone, and environment — never his description.
  </Step>

  <Step title="Version deliberately">
    To change the look, bump to `professor-high-v2` and re-shoot one full episode as a side-by-side test. Never mix versions inside a single episode.
  </Step>
</Steps>

<Warning>
  **Never put consumption on camera.** No smoking, no lit product, no paraphernalia in any Professor High shot, in any show. It is a TikTok moderation risk that can cost the whole account, and it contradicts the positioning — he studies cannabis, he does not use it. The [negative prompt](/social/character-config#the-negative-prompt) enforces this at generation time.
</Warning>

## Rule Zero Applies To One Character Only

Rule Zero locks Professor High. It does **not** lock anyone else, and every prompt in the library now says so explicitly in its `CHARACTERS` block:

```text theme={null}
CHARACTERS
- professor-high-v1 — LOCKED. Already loaded with his image, voice and
  personality. Do NOT re-describe him — re-describing a saved character is the
  main cause of drift.
- THE MAXIMIZER — SWAPPABLE. Use the-maximizer-v1 if you have built it, or cast
  ANY Cantina character who reads as: confident, decisive and completely wrong
  — optimising for the biggest number.
- Any supporting role may be recast freely between packs, never inside one — a
  recast mid-pack turns a format test into a casting test. Briefs and swap
  rules: /social/cast
```

**Supporting characters are roles, not assets.** Cast them from Cantina's existing roster, build your own, or change your mind next month. The brief is what has to hold, not the specific character.

<Card title="The Supporting Cast — briefs and swap rules" icon="users-rectangle" href="/social/cast">
  Nine roles with paste-ready casting briefs, the four swap rules, and the casting order that unlocks the most episodes per decision.
</Card>

<Warning>
  **The one hard constraint on recasting: never inside a pack.** A pack runs 5-10 reps of one format so a median exists. Change the cast at rep 4 and the pack stops measuring the format and starts measuring the recast, with no way to separate them afterwards. Cast once per pack, write it down, change freely between packs.
</Warning>

## The Two Grammars

Comedy and education are **different visual languages** on this platform, and mixing them is what the first draft got wrong.

|                    | Comedy                                                                                  | Education                                       |
| ------------------ | --------------------------------------------------------------------------------------- | ----------------------------------------------- |
| **Opening**        | Cold, mid-scene, on dialogue                                                            | Stated premise or conclusion to camera          |
| **On-screen text** | **None** — or one card as a punchline                                                   | Every key point, plus a citation                |
| **Who opens**      | A cast character                                                                        | The educator                                    |
| **Runtime**        | 15-30s                                                                                  | 30-60s                                          |
| **Evidence**       | Sticker data across every top comedy animation checked came back **zero text stickers** | **Every** education video checked used stickers |

<Warning>
  **Education grammar is the suppressed grammar.** The largest cannabis-science educator on the platform watched videos that used to do 200K fall to 2K. Comedy grammar is not suppressed. When in doubt, shoot comedy grammar and let the fact ride inside it.
</Warning>

### Citation cards — education only

Both top cannabis educators put the actual paper on screen: `Smith et al., PLOS One 2021`, `Gowin JL et al., JAMA Netw Open 2025`. It converts an assertion into evidence in a single frame, and we do it nowhere.

Any education script making a research claim now carries a citation card in the lower third for the duration of that claim. Format: `Author et al., Journal Year`. Small, persistent, never animated.

## Shot Prompt Grammar

Every `SHOT` cell in a script pack is written in the same four-part order. Keep the order; the generator weights early tokens more heavily.

```text theme={null}
[CHARACTER STATE] + [ACTION] + [CAMERA] + [FRAME ELEMENT]
```

| Part                | Purpose                                          | Examples                                                                                                    |
| ------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- |
| **Character state** | The emotional read, drawn from the reference set | `neutral`, `excited, crown perked`, `skeptical, one brow raised`, `disappointed, crown drooping`, `deadpan` |
| **Action**          | What he physically does                          | `holding clipboard`, `sliding a chart into frame`, `leaning toward lens`, `setting down a test tube`        |
| **Camera**          | Shot size and movement                           | `static chest-up`, `slow push-in`, `whip cut to`, `locked wide`                                             |
| **Frame element**   | The graphic sharing the frame                    | `terpene bar chart lower third`, `receipt photo pinned top-left`, `score counter center`                    |

A complete shot cell:

```text theme={null}
excited, crown perked + sliding a terpene chart into frame + slow push-in
+ terpene bar chart lower third
```

## Recurring Visual Assets

Build these once, reuse forever. Consistency of the furniture matters as much as consistency of the character.

| Asset                   | Where It Appears                                 | Spec                                                                                     |
| ----------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------- |
| **Terpene bar chart**   | Receipts, Why You're Really High, Roast My Stash | Top three terpenes only, never the full panel. Brand colors. Percentages always visible. |
| **DECODED stamp**       | TIWIH Receipts                                   | Lands on the cut into the decode beat. Rubber-stamp motion, slight rotation.             |
| **VERDICT stamp**       | Budtender Court                                  | Red, hard impact, gavel sound synced to the frame it lands on.                           |
| **Score counter**       | Roast My Stash                                   | Animated 1-to-100 count-up, decelerating into the final number.                          |
| **Lab Log lower-third** | Lab Logs                                         | `LAB LOG #XXXX — H:MM AM`. Monospace. Snaps in, no fade.                                 |
| **Clipboard graphic**   | High IQ Test                                     | Question typed on it, four lettered answer cards below.                                  |
| **Closing card**        | Every show                                       | Professor High logo, show name, and the show's submission tag.                           |

## Voice Direction

| Attribute    | Direction                                                                                                     |
| ------------ | ------------------------------------------------------------------------------------------------------------- |
| **Pace**     | Brisk. Roughly 165-180 words per minute. Faster than a lecture, slower than an ad read.                       |
| **Tone**     | Warm authority. The friend who happens to be the smartest person in the room and is not showing off about it. |
| **Register** | Mid-range, lightly resonant. Not a booming narrator, not a cartoon squeak.                                    |
| **Emphasis** | Land hard on numbers and terpene names. Those are the memorable units.                                        |
| **Never**    | Vocal fry, upspeak, radio-DJ energy, or an ironic drawl.                                                      |

Word budgets, at pace, after leaving room for beats:

| Runtime    | Spoken word budget |
| ---------- | ------------------ |
| 30 seconds | 70-80 words        |
| 45 seconds | 105-120 words      |
| 60 seconds | 145-165 words      |

<Note>
  Scripts in this section are written to those budgets. If a script runs long in production, cut a clause from the setup — never from the payoff or the CTA.
</Note>

## Caption Burn-In

TikTok's own auto-captions are inconsistent and ugly. Burn ours in.

* Bold sans-serif, white, heavy stroke or drop shadow for legibility on any background.
* Maximum **six words per line**, maximum two lines at a time.
* Key terms — terpene names, percentages, strain names — highlighted in pineapple yellow (#D98E04).
* Positioned in the lower third, clear of the TikTok UI safe zone: keep 250px clear at the bottom and 120px at the top of a 1080x1920 frame.
* Captions appear **word-synced**, not sentence-dumped. Synced captions measurably hold retention better.

## Audio

| Layer              | Rule                                                                                                                                                                                        |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Music bed**      | The strain's own AI soundtrack when the episode features a strain that has one. Check for an `audio_url` before scripting around the track. Otherwise a lo-fi lab bed at -18dB under voice. |
| **Voice**          | Always the loudest element. Normalize to -14 LUFS.                                                                                                                                          |
| **Stingers**       | Each show owns one recurring sound: gavel for Court, stamp thud for Receipts, candle-flicker tone for Lab Logs, timer tick for High IQ Test.                                                |
| **Trending audio** | Only when it does not fight the voiceover. A trending sound under an explainer costs more in comprehension than it gains in reach.                                                          |

## Output Spec

| Setting           | Value                                           |
| ----------------- | ----------------------------------------------- |
| Aspect ratio      | 9:16 vertical                                   |
| Resolution        | 1080 x 1920                                     |
| Frame rate        | 30fps                                           |
| Format            | H.264 MP4                                       |
| Loudness          | -14 LUFS integrated                             |
| Runtime tolerance | Within 2 seconds of the script's stated runtime |

## File Naming

Every render is named for its tracking row. This is what makes the [performance log](/social/scripts/testing-framework#the-performance-log) joinable to the actual files.

```text theme={null}
{script-id}_{hook-variant}_{YYYYMMDD}.mp4

TR-001_A_20260805.mp4
HIQ-003_B_20260807.mp4
```

Renders live in the OpenMontage `projects/` directory, **not** in this repository. Only scripts, logs, and specs are committed here.

## Continuity Checklist

Run before any episode ships. Two minutes here prevents a visibly broken character on a video that goes big.

<Steps>
  <Step title="AI label applied">
    The AIGC / "AI-generated" toggle is on before posting. Properly labeled AI carries **no algorithmic penalty**; undisclosed synthetic content runs warning → 7-day restriction → 30-day suspension → permanent ban. This is non-negotiable and it is the first check for a reason.
  </Step>

  <Step title="Compliance lane">
    No consumption, no product, no paraphernalia in frame. Nothing that reads as promoting or glorifying use. The video is informative or observational. See [The Compliance Lane](/social/scripts/platform-research#the-compliance-lane).
  </Step>

  <Step title="Character match">
    Compare a frame against the archived reference stills. Crown shape, eye spacing, coat collar. If it reads as a different pineapple, regenerate.
  </Step>

  <Step title="Environment match">
    Lab background present and dark. No kitchen, no void, no drift into a new room.
  </Step>

  <Step title="Safe zones clear">
    Nothing important within 250px of the bottom or 120px of the top.
  </Step>

  <Step title="Data tokens filled">
    Zero `[DATA: ...]` tokens surviving in the burned-in text or the voiceover.
  </Step>

  <Step title="Claim check">
    No medical claim. No unverified number. No consumption on camera. Cross-check against the [Verified Data Sheet](/social/scripts/verified-data).
  </Step>

  <Step title="Hook timing">
    A complete idea, spoken and on screen, before 1.5 seconds.
  </Step>
</Steps>

## Draft-First Guardrail

Cantina renders **drafts**. Nothing auto-posts. Every video clears human review before it reaches a platform — the same rule the [Video Production Pipeline](/social/video-pipeline) applies to every other render path.

## Related

<CardGroup cols={3}>
  <Card title="Script Room" icon="clapperboard" href="/social/scripts/overview">
    The packs that consume this spec.
  </Card>

  <Card title="Verified Data" icon="database" href="/social/scripts/verified-data">
    The numbers allowed on camera.
  </Card>

  <Card title="Video Pipeline" icon="film" href="/social/video-pipeline">
    Render paths and draft-first guardrails.
  </Card>
</CardGroup>
